Trovo difficile formulare la domanda con precisione, ma darò il massimo. Uso dwm
come gestore delle finestre predefinito edmenu
come 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/Program
sostituire la shell con il comando specificato senza creare un nuovo processosh -c /path/to/Program
avviare il processo dipendente dalla shell/path/to/Program
avviare 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 -efl
in condizioni diverse. Genera una nuova shell /bin/bash
e 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/bash
il 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 verbose
E lo è, PPID 1
allora sarà il genitore del programma. Ecco cosa ho cercato di spiegare usando un grafico: è chromium
stato avviato tramite dmenu
, è firefox
stato 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 init
processo, ovvero il processo con PID 1
?
init
- a quale potrebbe essere la risposta ... forse? dipende da come / se prevedi di parlarne, da cosa init
usi e da dove sono i canali di dati. In generale, le cose tenderanno a risolversi da sole, ecco a cosa init
servono. In ogni caso, di solito quando demonizzi un processo allora init
. O se vuoi il controllo del lavoro, shell corrente.
dmenu
e vedrò come vado d'accordo con quello che ho imparato. Trovo exec /path/to/Program & exit
o /bin/bash -c /path/to/Program & exit
essere abbastanza utilizzabile. Ma tutti hanno 1
cioè init
il genitore della Program
cosa che va bene per me fintanto che questo ha senso e non viola alcun *nix
principio 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--chromium
quando genererò firefox dalla shell. Come viene demonizzata la shell qui? Non è associato ad alcun terminale.