Trovo difficile formulare la domanda con precisione, ma darò il massimo. Uso dwmcome gestore delle finestre predefinito edmenucome il mio lanciatore di applicazioni. Difficilmente uso le applicazioni della GUI oltre al mio browser. Gran parte del mio lavoro viene svolto direttamente dalla riga di comando. Inoltre, sono un grande fan del minimalismo per quanto riguarda i sistemi operativi, le applicazioni, ecc. Uno degli strumenti di cui non mi sono mai liberato era un lanciatore di applicazioni. Principalmente perché non ho una comprensione precisa di come funzionano i lanciatori di applicazioni / cosa fanno. Anche una vasta ricerca su Internet mostra solo vaghe spiegazioni. Quello che voglio fare è sbarazzarmi anche del mio lanciatore di applicazioni perché, oltre a generare effettivamente l'applicazione, non ne ho assolutamente bisogno. Per fare ciò vorrei davvero sapere come "correttamente" avviare le applicazioni dalla shell. Per cui il significato di "correttamente" può essere approssimato da "come farebbe un lanciatore di applicazioni".
Conosco i seguenti modi per generare processi dalla shell:
exec /path/to/Programsostituire la shell con il comando specificato senza creare un nuovo processosh -c /path/to/Programavviare il processo dipendente dalla shell/path/to/Programavviare il processo dipendente dalla shell/path/to/Program 2>&1 &avviare un processo indipendente dalla shellnohup /path/to/Program &avvia il processo indipendente dalla shell e reindirizza l'output anohup.out
Aggiornamento 1: posso illustrare cosa, ad esempio dmenu, ricostruendolo da chiamate ripetute a ps -eflin condizioni diverse. Genera una nuova shell /bin/bashe come figlio di questa shell l'applicazione /path/to/Program. Fintanto che il bambino è in giro così a lungo il guscio sarà in giro. (Il modo in cui gestisce questo è al di là di me ...) Al contrario, se si emette nohup /path/to/Program &da una shell, /bin/bashil programma diventerà figlio di questa shell MA se si esce da questa shell, il genitore del programma sarà il processo più in alto. Quindi, se il primo processo è stato ad es. /sbin/init verboseE lo è, PPID 1allora sarà il genitore del programma. Ecco cosa ho cercato di spiegare usando un grafico: è chromiumstato avviato tramite dmenu, è firefoxstato avviato utilizzando 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
Aggiornamento 2: Immagino che la domanda possa anche essere ridotta a: Quale dovrebbe essere il genitore di un processo? Dovrebbe ad esempio essere una shell o dovrebbe essere il initprocesso, ovvero il processo con PID 1?
init- a quale potrebbe essere la risposta ... forse? dipende da come / se prevedi di parlarne, da cosa initusi e da dove sono i canali di dati. In generale, le cose tenderanno a risolversi da sole, ecco a cosa initservono. In ogni caso, di solito quando demonizzi un processo allora init. O se vuoi il controllo del lavoro, shell corrente.
dmenue vedrò come vado d'accordo con quello che ho imparato. Trovo exec /path/to/Program & exito /bin/bash -c /path/to/Program & exitessere abbastanza utilizzabile. Ma tutti hanno 1cioè initil genitore della Programcosa che va bene per me fintanto che questo ha senso e non viola alcun *nixprincipio di base .
exec &, credo. Di solito faccio solo le mie cose dal terminal ... forse potresti trarre qualche utilità dalla domanda di Ben Crowell qui . Ho una risposta lì, ma sono tutti molto bravi. comunque, quando fai da sfondo a un processo e il suo genitore muore come: l' sh -c 'cat & kill $$'hai lasciato orfano, e alla fine finisce per essere raccolto. questo è il lavoro di init - ecco perché ci cadono tutti.
systemd--bash--chromium. Tutti i metodi che provo alla fine porteranno ad un albero di processo nella forma seguente systemd--chromiumquando genererò firefox dalla shell. Come viene demonizzata la shell qui? Non è associato ad alcun terminale.