Ist kill -STOP ein temporärer Befehl?

3774
Andrew Grimm

Ich hatte 50 Prozesse (Hintergrund hier ) mit pausiert

kill -STOP 

und dann stürzte das Shell-Fenster ab (wahrscheinlich ein GUI-Problem - ich hatte gerade die Konfiguration um Hilfe zu den Bildlaufoptionen gebeten), und dies schien die 50 Prozesse anzuhalten. (Ich konnte sie wieder pausieren).

Aber warum sollte der Absturz der Shell dazu führen, dass die Prozesse unterbrochen werden? Sollten sie nicht pausieren, bis ihnen jemand sagt, er solle aufhören?

1

1 Antwort auf die Frage

5
mark4o

Infolge der Beendigung der Shell erfordert POSIX.1-2008 :

Wenn beim Beenden des Prozesses eine Prozessgruppe verwaist wird und ein Mitglied der neu verwaisten Prozessgruppe gestoppt wird, wird ein SIGHUP-Signal gefolgt von einem SIGCONT-Signal an jeden Prozess in der neu verwaisten Prozessgruppe gesendet .

Die Standardaktion beim Empfang von SIGHUP besteht darin, den Prozess zu beenden. Abhängig von der Shell und dem Start des Prozesses sowie von der Signalverarbeitung, die vom Prozess selbst eingerichtet wurde, kann SIGHUP vom Prozess ignoriert werden. In diesem Fall wird der Vorgang normal fortgesetzt.

Es wird davon ausgegangen, dass Prozesse in einer Prozessgruppe, die unter einer Jobsteuerungs-Shell ausgeführt werden, von dieser Shell als Gruppe bearbeitet werden und nicht vom Benutzer, der direkte SIGSTOP- und SIGCONT-Signale sendet. POSIX.1-2008 erklärt:

... Wenn eine Prozessgruppe durch die Beendigung eines Prozesses verwaist wird, werden die Prozesse innerhalb der Gruppe von ihrer Jobsteuerungs-Shell getrennt, die keine Informationen mehr über die Existenz der Prozessgruppe enthält. Angehaltene Prozesse innerhalb der Gruppe würden für immer schmachten. Um dieses Problem zu vermeiden, erhalten neu verwaiste Prozessgruppen, die gestoppte Prozesse enthalten, ein SIGHUP-Signal und ein SIGCONT-Signal, um anzuzeigen, dass sie von ihrer Sitzung getrennt wurden. Das SIGHUP-Signal bewirkt, dass die Prozessgruppenmitglieder beendet werden, es sei denn, sie werden SIGHUP erkannt oder ignoriert. In den meisten Fällen werden alle Mitglieder der Prozessgruppe angehalten, wenn eines von ihnen angehalten wird.

Ein Prozess könnte dieses Verhalten vermeiden, indem er seine eigene session ( setsid()) fälscht und erstellt, sodass er nicht mehr Teil der Session der Shell ist, in der er gestartet wurde. Die Jobsteuerung innerhalb der Shell, die Beendigung der Shell oder die vom Terminal generierten Signale beeinträchtigen ihn nicht.

Die Prozesse, die ich angehalten hatte, riefen nach anderen Ruby-Skripten (von denen einige selbst andere C-kompilierte Programme nannten). Könnte es SIGHUP als auf den Teilprozess zutreffend interpretiert haben? (Meine Skripte hatten jedoch keinen Code für die Signalverarbeitung.) Andrew Grimm vor 14 Jahren 0
SIGHUP und SIGCONT werden an alle Prozesse in der Prozessgruppe gesendet, die alle Unterprozesse umfasst (sofern sie nicht ihre eigene neue Prozessgruppe oder Sitzung gestartet haben). Sie können überprüfen, ob der Prozess SIGHUP ignoriert - unter Linux grep SigIgn: / proc // status und Prüfbit mit Wert 0x1; Verwenden Sie unter Solaris psig. mark4o vor 14 Jahren 0