Мені важко точно сформулювати це питання, але я дам все можливе. Я використовую dwm
в якості менеджера вікон за замовчуванням іdmenu
як мій запуск програми. Я навряд чи використовую програми GUI окрім свого браузера. Більшість моєї роботи виконується безпосередньо з командного рядка. Крім того, я великий прихильник мінімалізму щодо операційних систем, додатків тощо. Одним із інструментів, від якого я ніколи не позбувся, був запуск програми. Головним чином тому, що мені не вистачає точного розуміння того, як працюють пускові програми / що вони роблять. Навіть розширений пошук в Інтернеті виявляє лише розпливчасте пояснення. Що я хочу зробити, це позбутися навіть моєї програми запуску програм, тому що, крім фактично нерестуючої програми, я абсолютно не користуюся цим. Для цього мені дуже хочеться знати, як "правильно" запустити програми з оболонки. При цьому значення "правильно" можна наблизити до ", як це зробить запуск програми".
Мені відомо про такі способи нерестування процесів із оболонки:
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 з оболонки. Як тут демонізована шкаралупа? Він не пов'язаний з жодним терміналом.