Kann mir jemand erklären, ob und warum das disown
notwendig ist, wenn Sie einen Job auch nach der Trennung weiterlaufen lassen möchten?
Ich frage, weil auf allen von mir besuchten Sites empfohlen wird, disown
und zu verwenden, bg
aber bg
es allein funktioniert bei mir, und ich bin nicht sicher, warum.
Liegt es daran, dass ich nicht ganz verstanden habe, wozu disown
es dient, oder gibt es irgendwo Einstellungen, die das Standardverhalten des bg
Befehls beeinflussen?
Folgendes habe ich getan:
- Über SSH mit meiner CentOS 6-Box verbunden
Es wurde ein einfacher Prozess erstellt:
tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
Den Job ausgesetzt
- Habe es im Hintergrund fortgesetzt über
bg 1
- Verbindung zum SSH-Server getrennt
Anschließend habe ich per FTP geprüft, ob die .tar.gz
Datei immer noch größer wurde, und das war der Fall.
Antwort1
Prozesse, die über bg
oder in den Hintergrund gedrängt werden &
, werden typischerweise in zwei Szenarien beendet:
- Die Shell empfängt ein SIGHUP
- Sie versuchen, auf ein Terminal zu schreiben, das nicht mehr existiert.
Punkt 1 ist der Hauptschuldige beim Schließen Ihres Terminals. Ob dies jedoch geschieht oder nicht, hängt davon ab,WieSie schließen Ihr Terminal. Sie können es folgendermaßen schließen:
- So etwas wie das Klicken auf das "X" in Ihrem Fenstermanager
- Sie können
exit
,logout
, oder CTRL+ eingeben D.
Bei Punkt 1 wird ein SIGHUP gesendet, bei Punkt 2 nicht.
Kurz gesagt: Wenn Sie einen Prozess mit in den Hintergrund stellen und sich dann mit , , oder + bg
abmelden , wird der Prozess nicht beendet.exit
logout
CTRLD
Antwort2
Wenn Sie ein Terminal schließen, erhalten alle Prozesse, die dieses Terminal verwenden (siehe TTY
Spalte in der Ausgabe), ein . Es liegt am Prozess, was er damit macht . In klassischen Unix-Systemen (AIX, Solaris) werden Prozesse mit diesem Signal geschlossen. Deshalb müssen Sie verwenden . Von :ps -elf
SIGHUP
SIGHUP
disown
man bash
Die Shell wird standardmäßig beendet, wenn ein SIGHUP empfangen wird. Vor dem Beenden sendet eine interaktive Shell das SIGHUP erneut an alle laufenden oder gestoppten Jobs. An gestoppte Jobs wird SIGCONT gesendet, um sicherzustellen, dass sie das SIGHUP empfangen. Um zu verhindern, dass die Shell das Signal an einen bestimmten Job sendet, sollte dieser mit dem integrierten Befehl disown (siehe unten „SHELL BUILTIN COMMANDS“) aus der Jobtabelle entfernt oder mit disown -h so markiert werden, dass er kein SIGHUP empfängt.