Es fällt mir schwer, die Frage genau zu formulieren, aber ich werde mein Bestes geben. Ich benutze dwm
als Standard Windows Manager unddmenu
als mein Anwendungsstarter. Abgesehen von meinem Browser verwende ich kaum GUI-Anwendungen. Die meiste Arbeit erledige ich direkt über die Kommandozeile. Außerdem bin ich ein großer Fan von Minimalismus in Bezug auf Betriebssysteme, Anwendungen usw. Eines der Tools, das ich nie losgeworden bin, war ein Anwendungsstarter. Hauptsächlich, weil ich nicht genau verstehe, wie Anwendungsstarter funktionieren / was sie tun. Sogar umfangreiche Internetrecherchen zeigen nur vage Erklärungen. Was ich tun möchte, ist, sogar meinen Anwendungsstarter loszuwerden, da ich, abgesehen vom eigentlichen Spawnen der Anwendung, absolut keinen Nutzen dafür habe. Dazu möchte ich wirklich wissen, wie man Anwendungen von der Shell aus "richtig" startet. Wobei die Bedeutung von "richtig" durch "wie ein Anwendungsstarter" angenähert werden kann.
Ich kenne die folgenden Möglichkeiten, um Prozesse aus der Shell zu erzeugen:
exec /path/to/Program
Ersetzen Sie die Shell durch den angegebenen Befehl, ohne einen neuen Prozess zu erstellensh -c /path/to/Program
Starten Sie den Shell-abhängigen Prozess/path/to/Program
Starten Sie den Shell-abhängigen Prozess/path/to/Program 2>&1 &
Starten Sie den Shell-unabhängigen Prozessnohup /path/to/Program &
Starten Sie den Shell-unabhängigen Prozess und leiten Sie die Ausgabe an umnohup.out
Update 1: Ich kann veranschaulichen, was z. B. dmenu
die Rekonstruktion von wiederholten Aufrufen ps -efl
unter verschiedenen Bedingungen bedeutet. Es wird eine neue Shell erzeugt /bin/bash
und als Kind dieser Shell die Anwendung /path/to/Program
. Solange das Kind in der Nähe ist, ist die Muschel in der Nähe. (Wie es das schafft, ist mir ein Rätsel ...) Wenn Sie dagegen nohup /path/to/Program &
von einer Shell ausgehen, /bin/bash
wird das Programm das untergeordnete Element dieser Shell, ABER wenn Sie diese Shell beenden, wird das übergeordnete Element des Programms der oberste Prozess. Wenn also der erste Prozess zB war /sbin/init verbose
und es PPID 1
dann hat, wird es der Elternteil des Programms sein. Hier ist, was ich anhand eines Diagramms zu erklären versuchte: chromium
Wurde gestartet über dmenu
, firefox
wurde gestartet mit 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
Update 2: Ich denke, die Frage kann auch auf Folgendes reduziert werden: Was sollte das Elternteil eines Prozesses sein? Soll es zB eine Shell sein oder soll es der init
Prozess sein, also der Prozess mit PID 1
?
init
- worauf könnte die antwort lauten ... vielleicht? es hängt davon ab, wie / ob Sie mit ihm sprechen möchten, was init
Sie verwenden und wo sich die Datenkanäle befinden. Im Allgemeinen wird das Zeug dazu neigen, sich von selbst auszuarbeiten - dafür init
ist es da. In jedem Fall normalerweise dann, wenn Sie einen Prozess dämonisieren init
. Oder wenn Sie Auftragssteuerung möchten, aktuelle Shell.
dmenu
und sehen, wie ich mit dem, was ich gelernt habe, zurechtkomme. Ich finde exec /path/to/Program & exit
oder /bin/bash -c /path/to/Program & exit
ganz brauchbar zu sein. Aber sie alle machen 1
also init
die Eltern von Program
denen, die mir recht sind, solange dies Sinn macht und keine *nix
Grundprinzipien verletzt .
exec &
, denke ich. Normalerweise erledige ich meine Sachen nur vom Terminal aus. Vielleicht kann die Frage von Ben Crowell hier etwas nützen . Ich habe dort eine Antwort, aber alle sind sehr gut. Jedenfalls, wenn Sie einen Prozess im Hintergrund haben und sein Elternteil stirbt, wie: sh -c 'cat & kill $$'
Sie verwaisen ihn, und es kommt schließlich dazu, dass er geerntet wird. das ist die aufgabe von init - deshalb fallen sie alle darauf herein.
systemd--bash--chromium
. Alle Methoden, die ich versuche, führen letztendlich zu einem Prozessbaum der folgenden Form, systemd--chromium
wenn ich Firefox aus der Shell spawne. Wie wird die Muschel hier dämonisiert? Es ist keinem Terminal zugeordnet.