Überprüfen Sie den Befehl disown

10

Ich habe die ^z; bg; disownSequenz 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)?

Mikewaters
quelle
1
Ich frage mich, ob dies zu unix.stackexchange.com
Rilindo
2
Nur neugierig, warum nicht: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Antworten:

12

In Bash entfernt der disownvon ihm selbst ausgegebene Befehl Hintergrundprozesse (über bgoder &) 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. Das disown -hFlag 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 jobsBefehl 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 sehen ps ux, topund anderes Prozess-Viewing - Dienstprogramme.

Nachdem ein Job abgelehnt wurde, können Sie warten, bis er auf natürliche Weise beendet wird, oder ein Signal killan 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:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Ich verwende es normalerweise nur, disownwenn ich einen möglicherweise lang laufenden Befehl wie ein rsyncoder ausführe cpund 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 oder teein eine Datei ing, läuft es mit nohupoder läuft es in screen(die Sie Eigentum an der Befehl zurückzuerobern erlaubt / beenden danach ).

Beispiele:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null
Lunixbochs
quelle
1
+1 Informativ und mit Beispielen. Nett!
Andy Smith
Sehr informativer Kommentar; Wollen Sie damit sagen, dass es nicht möglich ist, die Trennung eines Prozesses zu überprüfen (abgesehen davon, dass er nicht mehr in der Jobtabelle vorhanden ist)?
Mikewaters
1
Wenn Sie detacheinen Hintergrundjob ausführen , wird dieser getrennt :) Es gibt dort keinen Mittelweg, auf dem das Ausführen eines Hintergrundprozesses nichts bewirkt. Durch die Überprüfung wird jobsnur bestätigt, dass Sie nicht versucht haben, einen gestoppten Prozess oder etwas anderes zu trennen.
Lunixbochs