Ich habe das folgende Skript:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Wenn ich sende SIGHUP
(mit kill -HUP pid
), passiert nichts.
Wenn ich das Skript leicht ändere:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... dann macht das Skript das echo HUP
Ding richtig, wenn es beendet wird (wenn ich Strg + C drücke):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
Was ist los? Wie soll ich ein Signal SIGHUP
an dieses Skript senden (es muss nicht unbedingt sein )?
cat
Prozess abgeschlossen ist. Probieren Sie Ihr ursprüngliches Skript aus und drücken SieCtrl+D
, um dencat
Vorgang zu beenden. Während dercat
Prozess im Vordergrund steht, wird dasHUP
Signal nicht bearbeitet. Versuchen Sie es erneut mitcat
ersetzt durchread
(eine eingebaute Shell).while true; do read; done
am Ende verwendet, andernfalls wird es auch durch Eingabe von Text beendet, und ich möchte, dass es bei Strg + C beendet wird.Antworten:
Das Bash-Handbuch besagt:
Das bedeutet, dass trotz des Empfangs des Signals
bash
beim Senden Ihre Falle bei SIGHUP nur aufgerufen wird, wenn siecat
endet.Wenn dieses Verhalten unerwünscht ist, verwenden
bash
Sie entweder integrierte Funktionen (z. B.read
+printf
in einer Schleife anstelle voncat
) oder Hintergrundjobs (siehe Stéphanes Antwort ).quelle
@xhienne hat bereits erklärt, warum , aber wenn Sie möchten , dass das Signal sofort aktiviert wird (und das Skript nicht beendet wird), können Sie Ihren Code ändern in:
Der kleine Tanz mit Dateideskriptoren besteht darin, die Tatsache zu
bash
umgehen , dass stdin/dev/null
für im Hintergrund gestartete Befehle umgeleitet wird .quelle