Мне сложно точно сформулировать вопрос, но я сделаю все возможное. Я использую в 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 из оболочки. Как оболочка демонизируется здесь? Он не связан ни с одним терминалом.