Me resulta difícil formular la pregunta con precisión, pero daré lo mejor de mí. Yo uso dwm
como mi administrador de ventanas predeterminado ydmenu
como mi lanzador de aplicaciones. Apenas uso aplicaciones GUI aparte de mi navegador. La mayor parte de mi trabajo se realiza directamente desde la línea de comandos. Además, soy un gran admirador del minimalismo con respecto a los sistemas operativos, aplicaciones, etc. Una de las herramientas de las que nunca me deshice fue un lanzador de aplicaciones. Principalmente porque no tengo una comprensión precisa de cómo funcionan los lanzadores de aplicaciones / qué hacen. Incluso la búsqueda exhaustiva en Internet solo muestra una vaga explicación. Lo que quiero hacer es deshacerme incluso de mi iniciador de aplicaciones porque, aparte de engendrar la aplicación, no tengo absolutamente ninguna utilidad. Para hacer esto, me gustaría saber cómo iniciar "correctamente" las aplicaciones desde el shell. Por lo que el significado de "correctamente" se puede aproximar por "como lo haría un lanzador de aplicaciones".
Conozco las siguientes formas de generar procesos desde el shell:
exec /path/to/Program
reemplazar shell con el comando especificado sin crear un nuevo procesosh -c /path/to/Program
iniciar proceso dependiente de shell/path/to/Program
iniciar proceso dependiente de shell/path/to/Program 2>&1 &
lanzar proceso independiente de shellnohup /path/to/Program &
lanzar un proceso independiente de shell y redirigir la salidanohup.out
Actualización 1: puedo ilustrar lo que dmenu
hace, por ejemplo , reconstruirlo desde llamadas repetidas a ps -efl
diferentes condiciones. Genera un nuevo shell /bin/bash
y, como hijo de este shell, la aplicación /path/to/Program
. Mientras el niño esté cerca, la concha estará alrededor. (La forma en que maneja esto está más allá de mí ...) Por el contrario, si emite nohup /path/to/Program &
un shell /bin/bash
, el programa se convertirá en el hijo de este shell, PERO si sale de este shell, el padre del programa será el proceso superior. Entonces, si el primer proceso fue, por ejemplo, /sbin/init verbose
y lo ha sido PPID 1
, será el padre del programa. Esto es lo que intenté explicar usando un gráfico: chromium
se lanzó a través de dmenu
, firefox
se lanzó usando 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
Actualización 2: Supongo que la pregunta también se puede resumir en: ¿Cuál debería ser el padre de un proceso? ¿Debería ser, por ejemplo, un shell o debería ser el init
proceso, es decir, el proceso con PID 1
?
init
, a lo que la respuesta podría ser ... ¿tal vez? depende de cómo / si planeas hablar con él, qué init
usas y dónde están los canales de datos. En general, esas cosas tenderán a resolverse por sí solas, para eso init
están. En cualquier caso, generalmente cuando demoniza un proceso entonces init
. O si quieres control de trabajo, shell actual.
dmenu
y veré cómo me llevo con lo que aprendí. Me parece exec /path/to/Program & exit
o /bin/bash -c /path/to/Program & exit
para ser bastante utilizable. Pero todos ellos son, 1
es decir, init
el padre de lo Program
que está bien para mí siempre que tenga sentido y no viole ningún *nix
principio básico .
exec &
, creo. Por lo general, hago mis cosas desde la terminal ... tal vez te sirva de algo la pregunta de Ben Crowell aquí . Tengo una respuesta allí, pero todas son muy buenas. de todos modos, cuando creas un proceso en segundo plano y su padre muere como: sh -c 'cat & kill $$'
lo huérfano, y finalmente termina siendo cosechado. ese es el trabajo de init, por eso todos caen en él.
systemd--bash--chromium
. Todos los métodos que pruebo en última instancia conducirán a un árbol de procesos de la siguiente forma systemd--chromium
cuando engendro firefox desde el shell. ¿Cómo se demoniza el caparazón aquí? No está asociado a ningún terminal.