Es fällt mir schwer, die Frage genau zu formulieren, aber ich werde mein Bestes geben. Ich benutze dwmals Standard Windows Manager unddmenuals 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/ProgramErsetzen Sie die Shell durch den angegebenen Befehl, ohne einen neuen Prozess zu erstellensh -c /path/to/ProgramStarten Sie den Shell-abhängigen Prozess/path/to/ProgramStarten 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. dmenudie Rekonstruktion von wiederholten Aufrufen ps -eflunter verschiedenen Bedingungen bedeutet. Es wird eine neue Shell erzeugt /bin/bashund 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/bashwird 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 verboseund es PPID 1dann hat, wird es der Elternteil des Programms sein. Hier ist, was ich anhand eines Diagramms zu erklären versuchte: chromiumWurde gestartet über dmenu, firefoxwurde 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 initProzess 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 initSie verwenden und wo sich die Datenkanäle befinden. Im Allgemeinen wird das Zeug dazu neigen, sich von selbst auszuarbeiten - dafür initist es da. In jedem Fall normalerweise dann, wenn Sie einen Prozess dämonisieren init. Oder wenn Sie Auftragssteuerung möchten, aktuelle Shell.
dmenuund sehen, wie ich mit dem, was ich gelernt habe, zurechtkomme. Ich finde exec /path/to/Program & exitoder /bin/bash -c /path/to/Program & exitganz brauchbar zu sein. Aber sie alle machen 1also initdie Eltern von Programdenen, die mir recht sind, solange dies Sinn macht und keine *nixGrundprinzipien 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--chromiumwenn ich Firefox aus der Shell spawne. Wie wird die Muschel hier dämonisiert? Es ist keinem Terminal zugeordnet.