disown
bewirkt, dass eine Shell SIGHUP nicht an ihren nicht freigegebenen Job sendet, wenn die Shell beendet wird, und
Entfernt den abgelehnten Job aus der Jobsteuerung der Shell.
Ist das erste das Ergebnis des zweiten? Mit anderen Worten, wenn ein von einer Shell gestarteter Prozess auf irgendeine Weise aus der Jobsteuerung der Shell entfernt wird, sendet die Shell dann nicht SIGHUP an den Prozess, wenn die Shell beendet wird?
disown -h
behält einen Prozess weiterhin unter der Job-Kontrolle einer Shell. Bedeutet das, dass disown -h
ein Prozess weiterhin SIGHUP von der Shell empfängt, aber die Aktion von SIGHUP durch den Prozess so einrichtet, dass sie "ignoriert" wird? Das klingt ähnlich wie nohup
.
$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+ Running sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+ Stopped sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit
$ ps aux | grep sleep
t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 sleep 123
Funktionieren disown -h
und nohup
arbeiten Sie effektiv gleich, wenn wir die Unterschiede bei der Verwendung eines Terminals außer Acht lassen?
Vielen Dank.
nohup
stdin / stdout / stderr (falls Ihre ursprüngliche Shell mit einer solchen verbunden ist) selbst umleiten müssen , wenn Sie sie nicht verwenden . (OTOH, ich halte das eigentlich für eine bessere Übung, als mich auf einen ungeheuren, hartkodierten Standard zu verlassen, wie./nohup.out
).Antworten:
nohup
unddisown -h
sind nicht genau dasselbe.Mit
disown
wird ein Prozess aus der Liste der Jobs in der aktuellen interaktiven Shell entfernt. Laufenjobs
nach einem Hintergrundprozess starten und laufendisown
wird als Job in der Schale nicht diesen Prozess zeigen. Ein abgelehnter Job erhält beim Beenden keinHUP
von der Shell (siehe Hinweis am Ende).Mit
disown -h
wird der Job nicht aus der Jobliste entfernt, aber die Shell sendet beim Beenden keinHUP
Signal (siehe Hinweis am Ende).Das
nohup
Dienstprogramm ignoriert dasHUP
Signal und startet das angegebene Dienstprogramm. Das Dienstprogramm erbt die Signalmaske vonnohup
und ignoriert daher auch dasHUP
Signal. Wenn die Shell beendet wird, bleibt der Prozess ein untergeordneter Prozess vonnohup
(undnohup
wird übergeordnetinit
).Der Unterschied besteht darin, dass der Prozess mit
nohup
Ignorieren gestartet wird,HUP
unabhängig davon, wer das Signal sendet. Die verleugnete Prozesse werden einfach nicht gesendet einHUP
Signal von der Schale , kann aber immer noch das Signal von zB gesendet werdenkill -s HUP <pid>
und wird dies nicht ignorieren.Beachten Sie, dass
HUP
nur dann an die Jobs einer Shell gesendet wird, wennhuponexit
Shell-Option ist gesetzt, oderHUP
Signal.Relevante Teile aus dem
bash
Handbuch (mein Schwerpunkt):Verbunden:
quelle
bash: disown: nohup: no such job
und auch fürsleep
und5
vondisown nohup sleep 5 &
. Was meintest du mit dem zweiten Befehl aus dem letzten Satz?&
(und die Reihenfolge vonnohup
unddisown
war auch falsch). Vielen Dank. Wird jetzt aktualisiert.disown
Sorgt dafür, dass eine Shell kein SIGHUP an ein untergeordnetes Objekt sendet, indem das untergeordnete Objekt aus der Jobliste der Shell entfernt wird. Wie wirddisown -h
dasselbe erreicht?Sie sind anders:
disown entfernt den Job aus der aktiven Jobtabelle. Fahren Sie dann mit dem aktuellen Job fort. Mit -h wird der Prozess NICHT SIGHUP gesendet. Es wird stattdessen mit der Shell, die es enthält, sterben gelassen, wenn es ein SIGHUP erhält.
nohup ignoriert das HUP. Dann wird alles, was beim Schließen des Prozesses an das Terminal übergeben worden wäre, in eine Datei verschoben
nohup.out
.quelle