Ich habe ein Bash-Skript zum Ausführen eines Servers, das normalerweise vom Benutzer mit Ctrl-C
beendet wird . Beim Beenden führt es eine Aufräumfunktion aus, die ich nicht durch ein zweites Ctrl-C
unterbrechen möchte .
#!/bin/bash
...
function cleanup {
trap '' INT
echo -n " Cleaning up..."
scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
echo " Finished."
exit 0
}
trap cleanup EXIT
...
Im Moment ein zweites Ctrl-C
vor dem scp
hat beendet bewirkt, dass das Skript auf unbestimmte Zeit hängen bleibt. Ich verstehe, dass dies etwas mit dem SIGINT
zu tun hat sowohl an das Bash-Skript als auch an scp
gesendet Prozess, aber ich bin ratlos, warum dies dazu führt, dass das Skript hängen bleibt, anstatt nur, dass die Bereinigung fehlschlägt.
Also meine Frage ist:
- Warum bleibt das Skript hängen?
- Wie kann ich verhindern, dass SIGINT den
scp
erreicht undssh
Untergeordnete Prozesse?
Akzeptierte Antwort:
trap '' INT
soll SIGINTs für die Shell und alle ihre Kinder ignorieren.
Aber ein Blick auf strace
gibt auf scp
aus , sieht es aus wie scp
installiert einen eigenen SIGINT-Handler, der das obige SIG_IGN aufhebt.
Die einzige Möglichkeit zu verhindern, dass es das SIGINT erhält, wäre, es in einer anderen Prozessgruppe auszuführen, wie z. B. mit:
perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...
oder
(set -m; scp ... & wait)
oder sagen Sie dem tty-Treiber, dass er aufhören soll, SIGINT bei Strg-C zu senden (wie mit stty -isig
, oder stty intr ''
für ^C
allein), obwohl Sie die Einstellungen später wiederherstellen möchten:
saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"