Mám bash skript pro spuštění serveru, který bude obvykle ukončen uživatelem pomocí Ctrl-C
. Při ukončení spustí funkci čištění, kterou nechci přerušit druhým Ctrl-C
.
#!/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
...
V tuto chvíli druhý Ctrl-C
před scp
Dokončeno způsobí, že se skript na neurčitou dobu zablokuje. Chápu, že to má něco společného s SIGINT
odesílá se jak do bash skriptu, tak do scp
procesu, ale nevím, proč to způsobuje zablokování skriptu, spíše než jen selhání čištění.
Moje otázka tedy zní:
- Proč to způsobuje zablokování skriptu?
- Jak mohu zabránit SIGINTu v dosažení
scp
assh
dětské procesy?
Přijatá odpověď:
trap '' INT
je určen k ignorování SIGINTů pro shell a všechny jeho potomky.
Ale při pohledu na strace
výstupy na scp
, vypadá to jako scp
nainstaluje svůj vlastní handler SIGINT, který zruší SIG_IGN výše.
Jediný způsob, jak zabránit tomu, aby získal SIGINT, by bylo spustit jej v jiné skupině procesů, jako je:
perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...
nebo
(set -m; scp ... & wait)
nebo řekněte ovladači tty, aby přestal odesílat SIGINT po Ctrl-C (jako u stty -isig
, nebo stty intr ''
pro ^C
sám), ačkoli poté budete chtít nastavení obnovit:
saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"