GNU/Linux >> Znalost Linux >  >> Linux

Zabránit Sigintu v dosahování dětských procesů?

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í:

  1. Proč to způsobuje zablokování skriptu?
  2. Jak mohu zabránit SIGINTu v dosažení scp a ssh 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"

Linux
  1. Zabránění souběžnému spuštění bash skriptu

  2. Ssh – skript pro automatizaci SCp v síti?

  3. Zjistit, zda je klávesa stisknuta ze skriptu?

  1. Zabránit obrazovce Gnu v ukončení relace, jakmile skončí spuštěný skript?

  2. Spusťte program z programu C

  3. Zabraňte ssh v rozbití parametrů skriptu shellu

  1. Podřízený proces obdrží SIGINT rodiče

  2. MYSQL se liší výstupem ze skriptu

  3. Spuštění Pycharm jako root ze spouštěče