GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verhindern, dass Sigint untergeordnete Prozesse erreicht?

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:

  1. Warum bleibt das Skript hängen?
  2. Wie kann ich verhindern, dass SIGINT den scp erreicht und ssh 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"

Linux
  1. Verhindern, dass ein Bash-Skript gleichzeitig ausgeführt wird

  2. Ssh – Skript zur Automatisierung von SCP im Netzwerk?

  3. Erkennen, ob die Taste aus dem Skript gedrückt wird?

  4. Verhindern Sie, dass ssh Shell-Skriptparameter auflöst

  5. Ausführen von Pycharm als root vom Launcher

So erhalten Sie die PID von einem gegabelten untergeordneten Prozess im Shell-Skript

Bash:Warum wird das übergeordnete Skript nicht bei SIGINT beendet, wenn das untergeordnete Skript SIGINT abfängt?

Ausführen eines Python-Skripts von PHP

Führen Sie ein Skript von überall aus

So verhindern Sie, dass ein Prozess Dateien schreibt

Wie unterscheidet Linux Threads von untergeordneten Prozessen?