Was sind die Unterschiede zwischen
$ nohup foo
und
$ foo &
und
$ foo &
$ disown
shell
nohup
job-control
disown
Lesmana
quelle
quelle
foo &!
Dinge, die gleichbedeutend sein sollten, wenn man sie von Anfang an ablehnt.foo & disown
sofort ablehnen.setsid
, und wie es sich aufdisown
und beziehtnohup
Antworten:
Schauen wir uns zunächst an, was passiert, wenn ein Programm von einer interaktiven Shell (die mit einem Terminal verbunden ist) ohne
&
(und ohne Umleitung) gestartet wird . Nehmen wir also an, Sie haben gerade Folgendes eingegebenfoo
:foo
wird erstellt.SIGHUP
, sendet sie auch einSIGHUP
an den Prozess (wodurch der Prozess normalerweise beendet wird).Schauen wir uns nun an, was passiert, wenn Sie den Prozess in den Hintergrund stellen, also Folgendes eingeben
foo &
:foo
wird erstellt.jobs
und kann über%n
(won
ist die Auftragsnummer) abgerufen werden .fg
. In diesem Fall wird es so fortgesetzt, als hätten Sie es nicht verwendet&
(und wenn es aufgrund des Versuchs, von der Standardeingabe zu lesen, angehalten wurde, kann es jetzt mit dem Lesen vom Terminal fortfahren).SIGHUP
, sendet sie auch einSIGHUP
an den Prozess. Abhängig von der Shell und möglicherweise von den für die Shell festgelegten Optionen wird beim Beenden der Shell auch einSIGHUP
an den Prozess gesendet.Nun
disown
entfernt den Auftrag aus der Auftragsliste der Schale, so dass alle Unterpunkte gelten nicht mehr (einschließlich dem Prozess eines gesendetSIGHUP
von der Shell). Beachten Sie jedoch, dass es immer noch mit dem Terminal verbunden ist. Wenn also das Terminal zerstört wird (was passieren kann, wenn es sich um ein Pty handelt, wie das, das vonxterm
oder erstellt wurdessh
, und das Steuerungsprogramm beendet wird, indem Sie das xterm schließen oder die SSH- Verbindung beenden ). schlägt das Programm fehl, sobald versucht wird, von der Standardeingabe zu lesen oder auf die Standardausgabe zu schreiben.Was den
nohup
Fall ist, auf der anderen Seite, ist effektiv aus dem Terminal , den Prozess zu trennen:EOF
).nohup.out
, sodass das Programm beim Fehlschlagen des Terminals nicht fehlschlägt, um in die Standardausgabe zu schreiben.SIGHUP
(also den Namen) empfängt .Beachten Sie, dass
nohup
sie nicht den Prozess von der Shell-Auftragssteuerung entfernen und auch nicht setzt sie nicht im Hintergrund (aber da ein Vordergrundnohup
Job mehr oder weniger nutzlos ist, würden Sie es in der Regel setzen in den Hintergrund verwenden&
). Anders als beidisown
wird Ihnen die Shell beispielsweise weiterhin mitteilen, wann der Nohup-Job abgeschlossen ist (es sei denn, die Shell wird zuvor beendet).Um es zusammenzufassen:
&
Setzt den Job in den Hintergrund, dh, der Versuch, Eingaben zu lesen, wird blockiert, und die Shell wartet nicht auf ihren Abschluss.disown
Entfernt den Prozess aus der Jobsteuerung der Shell, lässt ihn jedoch weiterhin mit dem Terminal verbunden. Eines der Ergebnisse ist, dass die Shell es nicht sendetSIGHUP
. Offensichtlich kann es nur auf Hintergrundjobs angewendet werden, da Sie es nicht eingeben können, wenn ein Vordergrundjob ausgeführt wird.nohup
Trennt den Prozess vom Terminal, leitet seinen Ausgang an umnohup.out
und schirmt ihn abSIGHUP
. Einer der Effekte (der benennende) ist, dass der Prozess keine gesendeten Nachrichten empfängtSIGHUP
. Es ist völlig unabhängig von der Jobkontrolle und kann grundsätzlich auch für Vordergrundjobs verwendet werden (obwohl dies nicht sehr nützlich ist).quelle
nohup
allein ein Google Chrome-Prozess nicht vor dem Schließen gespeichert wird, wenn das Terminal, von dem aus er gestartet wurde, geschlossen ist .disown %1
unddisown -h %1
? Die zweite Aufgabe wird als regulärer Job ausgeführt (ignoriert jedoch das HUP-Signal), bis das Terminal beendet wird.(foo&)
UnterschaleBei Verwendung von
&
wird das Programm im Hintergrund ausgeführt, sodass Sie eine neue Shell-Eingabeaufforderung erhalten, anstatt zu blockieren, bis das Programm endet.nohup
unddisown
sind weitgehend unabhängig; Sie unterdrücken SIGHUP-Signale (Auflegen), damit das Programm nicht automatisch beendet wird, wenn das steuernde Terminal geschlossen wird.nohup
tut dies, wenn der Job zum ersten Mal beginnt. Wenn Sie zunohup
Beginn keinen Job haben, können Siedisown
einen laufenden Job ändern. Ohne Argumente wird der aktuelle Job geändert, der gerade im Hintergrund ausgeführt wurdequelle
nohup
und vondisown
beiden kann gesagt werdenSIGHUP
, dass sie auf unterschiedliche Weise unterdrücken .nohup
veranlasst das Programm, das Signal zunächst zu ignorieren (das Programm kann dies ändern).nohup
versucht auch, dafür zu sorgen, dass das Programm kein steuerndes Terminal hat, damit es nichtSIGHUP
vom Kernel gesendet wird, wenn das Terminal geschlossen wird.disown
ist rein innerlich in der Schale; es bewirkt, dass die Shell nicht sendet,SIGHUP
wenn sie beendet wird.disown
Entfernen des Jobs von der Jobliste . Wenn Sie keine Option angeben, wird diese aus der Auftragsliste entfernt. Allerdings , wenn Sie die angeben-h
Option, jede jobspec wird nicht aus der Tabelle entfernt. Stattdessen wird es so erstellt, dassSIGHUP
es nicht an den Job gesendet wird, wenn die Shell ein empfängtSIGHUP
.&
gibt Ihnen using kein Terminal, es löst sichstdin
vom Prozess und veranlasst, dass es im Hintergrund ausgeführt wird, aber beidesstdout
undstderr
ist immer noch mit dem aktuellen tty verbunden. Dies bedeutet, dass Sie möglicherweise Text aus verschiedenen Programmen gemischt bekommen, was ziemlich ärgerlich sein kann, wenn Sie dies tungimp &
und viele GTK + -Fehler erhalten, während Sie versuchen, dieses tty für etwas anderes zu verwenden.Hier ist meine Erfahrung mit dem Versuch, Soffice im Hintergrund auszuführen, und zwar nach einem nicht beendenden Befehl (z
tail
. B. ). Für dieses Beispiel werde ich verwendensleep 100
.&
nohup .. &
& verleugnen
setsid .. &
Um Speicherplatz zu sparen
nohup setsid ..
:: zeigt keine Protokolle / Soffices an STOPPT NICHT an Ctrl-Cnohup
mit& disown
am Ende: zeigt keine Protokolle / Soffices an Ctrl-Cquelle
nohup ⟨command⟩ & disown
hört der erstellte Prozess nicht aufCtrl+C
.soffice
?soffice
Befehl scheint etwas anderes zu haben. Deshalb habe ich überlegt, es hier in der Regel als Ausnahme hinzuzufügen. Wenn Sie z. B.: verwendennohup .. &
, wirdCtrl-c
der Befehl durch Drücken von normalerweise nicht angehalten, jedoch durch Drücken vonsoffice
. Ich warte, bis jemand darauf tritt und erkläre, warum dies bei soffice passiert :)nohup soffice &
und drückteCtrl+C
. Nichts ist passiert, wie erwartet.