Ich habe die ^z; bg; disown
Sequenz ausgegeben , damit ich eine SSH-Sitzung schließen kann, in der ich einen überaus wichtigen Prozess mit langer Laufzeit ausführe. Dieser Prozess schreibt die Statusausgabe in stderr und hat dies auch nach dem Trennen fortgesetzt (überprüft mit lsof, dass stderr fd für r / w geöffnet ist).
Gibt es eine Möglichkeit festzustellen, ob der Prozess tatsächlich abgelehnt wurde (wird SIGHUP nicht zurückerhalten, wenn die Shell einen zurückerhält)?
Antworten:
In Bash entfernt der
disown
von ihm selbst ausgegebene Befehl Hintergrundprozesse (überbg
oder&
) aus der aktiven Jobtabelle und markiert sie so, dass beim Abmelden kein SIGHUP empfangen wird.Sie können auch einen oder mehrere Jobs zum Ablehnen übergeben, z
disown 1 3
. Dasdisown -h
Flag ist nützlich, wenn Sie Jobs in der Tabelle behalten möchten, aber beim Abmelden immer noch nicht SIGHUP.Sie können die Jobtabelle anzeigen, indem Sie den
jobs
Befehl eingeben. Nach einem erfolgreichen Hintergrund wird es angezeigt[1]+ command &
. Nachdem ein Job abgelehnt wurde, sollte er nicht mehr in der Jobtabelle angezeigt werden und beim Abmelden nicht mehr beendet werden. Sie können immer noch den Prozess über sehenps ux
,top
und anderes Prozess-Viewing - Dienstprogramme.Nachdem ein Job abgelehnt wurde, können Sie warten, bis er auf natürliche Weise beendet wird, oder ein Signal
kill
an die PID senden , um ihn zu stoppen.Da Bash den Job nur aus der Liste der zu beendenden laufenden Jobs entfernt und die Dateihandles für stdout und stderr Ihres Terminals noch geöffnet sind, erhalten Sie weiterhin Ausgaben vom Job, bis Ihr Endgerät geschlossen wird (wenn Sie sich abmelden). .
Beispiele:
Ich verwende es normalerweise nur,
disown
wenn ich einen möglicherweise lang laufenden Befehl wie einrsync
oder ausführecp
und danach entscheide, dass ich mich abmelden muss, ohne ihn zu beenden. Wenn Sie wissen , dass Sie einen Befehl auszuführen und sich abzumelden, können Sie die Ausgabe erfassen durch Rohrleitungen odertee
in eine Datei ing, läuft es mitnohup
oder läuft es inscreen
(die Sie Eigentum an der Befehl zurückzuerobern erlaubt / beenden danach ).Beispiele:
quelle
detach
einen Hintergrundjob ausführen , wird dieser getrennt :) Es gibt dort keinen Mittelweg, auf dem das Ausführen eines Hintergrundprozesses nichts bewirkt. Durch die Überprüfung wirdjobs
nur bestätigt, dass Sie nicht versucht haben, einen gestoppten Prozess oder etwas anderes zu trennen.