Trudno mi precyzyjnie sformułować pytanie, ale dam z siebie wszystko. Używam dwm
jako domyślnego menedżera okien idmenu
jako mój program uruchamiający aplikacje. Prawie nie używam aplikacji GUI poza przeglądarką. Większość mojej pracy jest wykonywana bezpośrednio z wiersza poleceń. Ponadto jestem wielkim fanem minimalizmu w odniesieniu do systemów operacyjnych, aplikacji itp. Jednym z narzędzi, którego nigdy się nie pozbyłem, było uruchamianie aplikacji. Głównie dlatego, że brakuje mi dokładnego zrozumienia działania programów uruchamiających aplikacje / ich działania. Nawet obszerne wyszukiwanie w Internecie pokazuje tylko niejasne wyjaśnienia. To, co chcę zrobić, to pozbyć się nawet mojego programu uruchamiającego aplikacje, ponieważ poza faktycznym spawaniem aplikacji, nie mam z niej absolutnie żadnego pożytku. W tym celu naprawdę chciałbym wiedzieć, jak „poprawnie” uruchamiać aplikacje z powłoki. Przy czym znaczenie „poprawnie” może być przybliżone przez „tak jak zrobiłby to program uruchamiający aplikacje”.
Wiem o następujących sposobach odradzania procesów z powłoki:
exec /path/to/Program
zamień powłokę na określone polecenie bez tworzenia nowego procesush -c /path/to/Program
uruchom proces zależny od powłoki/path/to/Program
uruchom proces zależny od powłoki/path/to/Program 2>&1 &
uruchom niezależny proces powłokinohup /path/to/Program &
uruchom niezależny od powłoki proces i przekieruj wyjście donohup.out
Aktualizacja 1: Mogę zilustrować, na przykład, co to dmenu
jest rekonstrukcja z powtarzających się wywołań ps -efl
w różnych warunkach. Odradza nową powłokę /bin/bash
i jako dziecko tej powłoki aplikacja /path/to/Program
. Tak długo, jak dziecko będzie w pobliżu, tak długo będzie w pobliżu. (Jak sobie z tym radzi, jest to poza mną ...) W przeciwieństwie do tego, jeśli wydajesz nohup /path/to/Program &
z powłoki, /bin/bash
program stanie się dzieckiem tej powłoki, ALE jeśli wyjdziesz z tej powłoki, rodzic programu będzie najwyższym procesem. Więc jeśli pierwszym procesem był np. /sbin/init verbose
I ma, PPID 1
to będzie rodzicem programu. Oto, co próbowałem wyjaśnić za pomocą wykresu: chromium
zostało uruchomione przez dmenu
, firefox
zostało uruchomione za pomocą exec firefox & exit
:
systemd-+-acpid
|-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper
| | `-chromium---5*[chromium-+-{Chrome_ChildIOT}]
| | |-{Compositor}]
| | |-{HTMLParserThrea}]
| | |-{OptimizingCompi}]
| | `-3*[{v8:SweeperThrea}]]
| |-chromium
| |-chromium-+-chromium
| | |-{Chrome_ChildIOT}
| | `-{Watchdog}
| |-{AudioThread}
| |-3*[{BrowserBlocking}]
| |-{BrowserWatchdog}
| |-5*[{CachePoolWorker}]
| |-{Chrome_CacheThr}
| |-{Chrome_DBThread}
| |-{Chrome_FileThre}
| |-{Chrome_FileUser}
| |-{Chrome_HistoryT}
| |-{Chrome_IOThread}
| |-{Chrome_ProcessL}
| |-{Chrome_SafeBrow}
| |-{CrShutdownDetec}
| |-{IndexedDB}
| |-{LevelDBEnv}
| |-{NSS SSL ThreadW}
| |-{NetworkChangeNo}
| |-2*[{Proxy resolver}]
| |-{WorkerPool/1201}
| |-{WorkerPool/2059}
| |-{WorkerPool/2579}
| |-{WorkerPool/2590}
| |-{WorkerPool/2592}
| |-{WorkerPool/2608}
| |-{WorkerPool/2973}
| |-{WorkerPool/2974}
| |-{chromium}
| |-{extension_crash}
| |-{gpu-process_cra}
| |-{handle-watcher-}
| |-{inotify_reader}
| |-{ppapi_crash_upl}
| `-{renderer_crash_}
|-2*[dbus-daemon]
|-dbus-launch
|-dhcpcd
|-firefox-+-4*[{Analysis Helper}]
| |-{Cache I/O}
| |-{Cache2 I/O}
| |-{Cert Verify}
| |-3*[{DOM Worker}]
| |-{Gecko_IOThread}
| |-{HTML5 Parser}
| |-{Hang Monitor}
| |-{Image Scaler}
| |-{JS GC Helper}
| |-{JS Watchdog}
| |-{Proxy R~olution}
| |-{Socket Thread}
| |-{Timer}
| |-{URL Classifier}
| |-{gmain}
| |-{localStorage DB}
| |-{mozStorage #1}
| |-{mozStorage #2}
| |-{mozStorage #3}
| |-{mozStorage #4}
| `-{mozStorage #5}
|-gpg-agent
|-login---bash---startx---xinit-+-Xorg.bin-+-xf86-video-inte
| | `-{Xorg.bin}
| `-dwm-+-dwmstatus
| `-xterm---bash-+-bash
| `-pstree
|-systemd---(sd-pam)
|-systemd-journal
|-systemd-logind
|-systemd-udevd
|-wpa_actiond
`-wpa_supplicant
Aktualizacja 2: Wydaje mi się, że pytanie można sprowadzić również do: Co powinno być rodzicem procesu? Czy powinien to być np. Powłoka, czy powinien to być init
proces, tj. Proces z PID 1
?
init
- na co odpowiedź może być ... może? zależy to od tego, jak / jeśli planujesz z nim rozmawiać, czego init
używasz i gdzie znajdują się kanały danych. Ogólnie rzecz biorąc, rzeczy będą się same układać - po to init
jest. W każdym razie, zwykle wtedy, gdy demonizujesz proces init
. Lub jeśli chcesz kontrolować zadania, bieżąca powłoka.
dmenu
i zobaczę, jak sobie radzę z tym, czego się nauczyłem. Uważam exec /path/to/Program & exit
lub /bin/bash -c /path/to/Program & exit
być całkiem użyteczne. Ale wszystkie czynią, 1
tj init
. Rodzicem, Program
co jest dla mnie w porządku, o ile ma to sens i nie narusza żadnych podstawowych *nix
zasad.
exec &
, że ty. Zwykle robię swoje rzeczy z terminala ... może skorzystasz z pytania Ben Crowella . Mam tam odpowiedź, ale wszystkie są bardzo dobre. tak czy inaczej, kiedy tło procesu, a jego rodzic umiera, to: sh -c 'cat & kill $$'
osierocacie go, a w końcu zostanie skończony. taka jest praca init - dlatego wszyscy do niej należą.
systemd--bash--chromium
. Wszystkie metody, które wypróbuję, ostatecznie doprowadzą do drzewa procesu o następującej formie, systemd--chromium
gdy spawnuję firefoxa z powłoki. Jak demonizowana jest tu skorupa? Nie jest powiązany z żadnym terminalem.