Мне сложно точно сформулировать вопрос, но я сделаю все возможное. Я использую в dwm
качестве моего оконного менеджера по умолчанию иdmenu
как мой запуск приложения. Я почти не использую приложения с графическим интерфейсом, кроме своего браузера. Большая часть моей работы выполняется непосредственно из командной строки. Кроме того, я большой поклонник минимализма в отношении операционных систем, приложений и т. Д. Одним из инструментов, от которого я никогда не избавлялся, была программа запуска приложений. Главным образом потому, что мне не хватает четкого понимания того, как работают программы запуска приложений / что они делают. Даже обширный поиск в Интернете показывает только смутное объяснение. То, что я хочу сделать, - это избавиться даже от моего средства запуска приложений, потому что кроме фактического запуска приложения, я его абсолютно не использую. Для этого мне бы очень хотелось узнать, как «правильно» запускать приложения из оболочки. При этом значение «правильно» может быть аппроксимировано «как бы запускала приложение».
Я знаю о следующих способах порождения процессов из оболочки:
exec /path/to/Program
заменить оболочку указанной командой без создания нового процессаsh -c /path/to/Program
запустить процесс, зависящий от оболочки/path/to/Program
запустить процесс, зависящий от оболочки/path/to/Program 2>&1 &
запустить оболочку независимый процессnohup /path/to/Program &
запустить процесс, независимый от оболочки, и перенаправить вывод вnohup.out
Обновление 1: я могу проиллюстрировать, что, например dmenu
, восстанавливает его из повторных вызовов в ps -efl
различных условиях. Он порождает новую оболочку /bin/bash
и, как потомок этой оболочки, приложение /path/to/Program
. Пока ребенок вокруг, пока вокруг будет раковина. (Как это управляет, я не знаю ...) В отличие от этого, если вы nohup /path/to/Program &
выполняете /bin/bash
команду из оболочки, тогда программа станет дочерней для этой оболочки, НО, если вы выйдете из этой оболочки, родительский процесс программы будет самым верхним процессом. Таким образом, если первый процесс был, например, /sbin/init verbose
и имеет, PPID 1
то он будет родителем программы. Вот что я пытался объяснить с помощью графика: chromium
был запущен с помощью dmenu
, firefox
был запущен с помощью 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
Обновление 2: я думаю, что вопрос также можно свести к следующему: что должно быть родителем процесса? Должно ли это быть, например, оболочкой или это init
процесс, то есть процесс с PID 1
?
init
- на что ответ может быть ... может быть? это зависит от того, как / если вы планируете поговорить с ним, что init
вы используете и где находятся каналы передачи данных. В общем, эти вещи, как правило, работают само собой - вот для чего init
. В любом случае, обычно, когда вы демонизируете процесс init
. Или, если вы хотите контроль работы, текущая оболочка.
dmenu
и посмотрю, как я справляюсь с тем, что узнал. Я нахожу exec /path/to/Program & exit
или /bin/bash -c /path/to/Program & exit
быть вполне пригодным для использования. Но все они делают 1
то init
родителем из Program
которых хорошо со мной до тех пор , как это имеет смысл , и не нарушает основные *nix
принципы.
exec &
, я думаю. Я обычно просто делаю свои вещи из терминала ... может быть, вы бы получили некоторую пользу от вопроса Бена Кроуэлла здесь . У меня есть ответ, но все они очень хорошие. в любом случае, когда вы создаете фоновый процесс и его родитель умирает, как: sh -c 'cat & kill $$'
вы осиротите его, и в конечном итоге он будет пожинен. это работа инициата - вот почему они все к ней относятся.
systemd--bash--chromium
. Все методы, которые я пробую, в конечном итоге приводят к дереву процессов следующей формы, systemd--chromium
когда я запускаю firefox из оболочки. Как оболочка демонизируется здесь? Он не связан ни с одним терминалом.