J'ai du mal à formuler la question avec précision, mais je ferai de mon mieux. J'utilise dwm
comme gestionnaire de fenêtres par défaut etdmenu
comme lanceur d'applications. J'utilise à peine les applications GUI en dehors de mon navigateur. La plupart de mon travail se fait directement à partir de la ligne de commande. De plus, je suis un grand fan du minimalisme concernant les systèmes d'exploitation, les applications, etc. L'un des outils dont je ne me suis jamais débarrassé était un lanceur d'applications. Principalement parce que je ne comprends pas exactement comment fonctionnent les lanceurs d'applications / ce qu'ils font. Même une recherche approfondie sur Internet ne révèle qu'une vague explication. Ce que je veux faire, c'est me débarrasser même de mon lanceur d'applications car en dehors de la création de l'application, je n'ai absolument aucune utilité. Pour ce faire, je voudrais vraiment savoir comment démarrer "correctement" les applications à partir du shell. Ainsi, la signification de "correctement" peut être approximée par "comme le ferait un lanceur d'application".
Je connais les façons suivantes de générer des processus à partir du shell:
exec /path/to/Program
remplacer le shell par la commande spécifiée sans créer de nouveau processussh -c /path/to/Program
lancer un processus dépendant du shell/path/to/Program
lancer un processus dépendant du shell/path/to/Program 2>&1 &
lancer un processus indépendant du shellnohup /path/to/Program &
lancer un processus indépendant du shell et rediriger la sortie versnohup.out
Mise à jour 1: je peux illustrer ce que fait par exemple sa dmenu
reconstruction à partir d'appels répétés ps -efl
dans différentes conditions. Il génère un nouveau shell /bin/bash
et en tant qu'enfant de ce shell, l'application /path/to/Program
. Tant que l'enfant est là, la coquille restera aussi longtemps. (La façon dont il gère cela me dépasse ...) En revanche, si vous sortez nohup /path/to/Program &
d'un shell, /bin/bash
le programme deviendra l'enfant de ce shell MAIS si vous quittez ce shell, le parent du programme sera le processus le plus élevé. Donc, si le premier processus était par exemple /sbin/init verbose
et qu'il a PPID 1
alors, il sera le parent du programme. Voici ce que j'ai essayé d'expliquer à l'aide d'un graphique: a chromium
été lancé via dmenu
, a firefox
été lancé en utilisant 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
Mise à jour 2: Je suppose que la question peut également se résumer à: Quel devrait être le parent d'un processus? Doit-il par exemple être un shell ou doit-il être le init
processus c'est-à-dire le processus avec PID 1
?
init
- à quoi pourrait être la réponse ... peut-être? cela dépend de comment / si vous prévoyez de lui parler, de ce que init
vous utilisez et de l'emplacement des canaux de données. En général, ces trucs auront tendance à s'arranger - c'est à ça que init
sert. Dans tous les cas, généralement lorsque vous démonifiez un processus init
. Ou si vous voulez contrôler le travail, le shell actuel.
dmenu
et voir comment je m'entends avec ce que j'ai appris. Je trouve exec /path/to/Program & exit
ou /bin/bash -c /path/to/Program & exit
être tout à fait utilisable. Mais ils font tous, 1
c'est-à init
- dire le parent de ce Program
qui me convient tant que cela a du sens et ne viole aucun *nix
principe de base .
exec &
, je pense. Habituellement, je fais juste mes affaires depuis le terminal ... peut-être que vous pourriez utiliser la question de Ben Crowell ici . J'ai une réponse là-bas, mais elles sont toutes très bonnes. de toute façon, quand vous fondez un processus et son parent meurt comme: sh -c 'cat & kill $$'
vous l'orphelin, et il finit par être récolté par la suite. c'est le travail d'init - c'est pourquoi ils y tombent tous.
systemd--bash--chromium
. Toutes les méthodes que j'essaie mèneront finalement à un arbre de processus de la forme suivante systemd--chromium
lorsque j'apparaît firefox à partir du shell. Comment l'obus est-il diabolisé ici? Il n'est associé à aucun terminal.