Ich war mit diesem Kommentar in anderer Frage überrascht :
Wenn Sie dd das USR1-Signal zu früh nach dem Start senden (dh in einem Bash-Skript die Zeile, nachdem Sie es gestartet haben), wird es tatsächlich beendet
Nicht so sehr eine Antwort auf Ihre Frage, aber versuchen Sie es mit diesem Einzeiler: { dd if=/dev/zero of=/dev/null & }; kill -USR1 $!; jobs; sleep 1; jobsum den Effekt zu reproduzieren, den Sie beschreiben.
Jippie
Antworten:
38
Jedes Signal hat eine "Standarddisposition" - was ein Prozess standardmäßig tut, wenn er dieses Signal empfängt. Es gibt eine Tabelle in der signal(7)Manpage, in der sie aufgelistet sind:
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
...
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGUSR1und SIGUSR2beide haben die Standardaktion Term- der Prozess wird beendet. ddRegistriert einen Handler, um das Signal abzufangen und etwas Nützliches zu tun. Wenn Sie jedoch zu schnell signalisieren, hatte er noch keine Zeit, diesen Handler zu registrieren, sodass stattdessen die Standardaktion ausgeführt wird
Ich wünschte, ich könnte zweimal dafür stimmen, dass ich auf diese Dunkelheit aufmerksam gemacht wurde. Das zufällige Absterben von Prozessen nach dem Entfernen eines expliziten Signal-Handlers war beunruhigend.
DeaconDesperado
1
Gibt es eine praktische Möglichkeit, diesen Rennzustand zu kontrollieren, anstatt nur eine angemessene Zeit lang zu schlafen (~ 0,5-1 Sek.)? (Ich meine, neben etwas Lächerlichem wie das Erfassen und Analysieren von straceAusgaben in einem Shell-Skript…)
Adrian Günter
Ich hatte ein Shell-Skript, das gut funktionierte. Aber plötzlich aufhören zu arbeiten wegen wahrscheinlich !: Ich hatte Hyperthreding jetzt ab. Der Subprozess, der kill -s SIGUSR1 $ PARENT_PID sendet, wird jetzt zu schnell. Das übergeordnete Element glaubt, dass das übergeordnete Element normal terminiert ist, aber das übergeordnete Element führt die Schleife weiterhin aus. Dies ist ein guter Beitrag. Ich habe den größten Teil des Tages damit verbracht, dies herauszufinden.
{ dd if=/dev/zero of=/dev/null & }; kill -USR1 $!; jobs; sleep 1; jobs
um den Effekt zu reproduzieren, den Sie beschreiben.Antworten:
Jedes Signal hat eine "Standarddisposition" - was ein Prozess standardmäßig tut, wenn er dieses Signal empfängt. Es gibt eine Tabelle in der
signal(7)
Manpage, in der sie aufgelistet sind:SIGUSR1
undSIGUSR2
beide haben die StandardaktionTerm
- der Prozess wird beendet.dd
Registriert einen Handler, um das Signal abzufangen und etwas Nützliches zu tun. Wenn Sie jedoch zu schnell signalisieren, hatte er noch keine Zeit, diesen Handler zu registrieren, sodass stattdessen die Standardaktion ausgeführt wirdquelle
strace
Ausgaben in einem Shell-Skript…)