GNU/Linux >> Linux Esercitazione >  >> Linux

Impedire a Signt di raggiungere i processi figlio?

Ho uno script bash per l'esecuzione di un server, che in genere verrà terminato dall'utente usando Ctrl-C . All'uscita esegue una funzione di pulizia, che non voglio venga interrotta da un secondo 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

...

Al momento, un secondo Ctrl-C prima di scp ha terminato fa sì che lo script si blocchi a tempo indeterminato. Capisco che questo ha qualcosa a che fare con il SIGINT inviato sia allo script bash che a scp processo, ma non sono sicuro del motivo per cui ciò causa il blocco dello script, anziché semplicemente causare il fallimento della pulizia.

Quindi la mia domanda è:

  1. Perché questo provoca il blocco dello script?
  2. Come posso impedire a SIGINT di raggiungere il scp e ssh processi figlio?

Risposta accettata:

trap '' INT ha lo scopo di ignorare i SIGINT per la shell e tutti i suoi figli.

Ma guardando strace output su scp , sembra scp installa il proprio gestore SIGINT che annulla il SIG_IGN sopra.

L'unico modo per impedirgli di ottenere il SIGINT sarebbe eseguirlo in un gruppo di processi diverso come con:

perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...

o

(set -m; scp ... & wait)

oppure dì al driver tty di interrompere l'invio di SIGINT su Ctrl-C (come con stty -isig o stty intr '' per ^C da solo), anche se vorresti ripristinare le impostazioni in seguito:

saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"

Linux
  1. Impedire l'esecuzione simultanea di uno script bash

  2. Ssh – Script per automatizzare Scp in rete?

  3. Rileva se il tasto viene premuto dallo script?

  4. Impedire a Tmux di avviarsi su Ssh?

  5. Processi in una sessione in una shell interattiva vs in uno script?

Esegue il programma dall'interno di un programma C

Impedisce a ssh di suddividere i parametri dello script della shell

Il processo figlio riceve il SIGINT del genitore

Esecuzione di uno script Python da PHP

Come impedire a un processo di scrivere file

In che modo Linux distingue i thread dai processi figlio?