GNU/Linux >> Tutoriels Linux >  >> Linux

Empêcher Sigint d'atteindre les processus enfants ?

J'ai un script bash pour exécuter un serveur, qui sera généralement terminé par l'utilisateur à l'aide de Ctrl-C . À la sortie, il exécute une fonction de nettoyage, que je ne veux pas être interrompue par un second 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

...

Pour le moment, un deuxième Ctrl-C avant le scp est terminé, le script se bloque indéfiniment. Je comprends que cela a quelque chose à voir avec le SIGINT étant envoyé à la fois au script bash et au scp processus, mais je ne comprends pas pourquoi cela provoque le blocage du script, plutôt que de simplement provoquer l'échec du nettoyage.

Donc ma question est :

  1. Pourquoi cela provoque-t-il le blocage du script ?
  2. Comment puis-je empêcher le SIGINT d'atteindre le scp ? et ssh processus fils ?

Réponse acceptée :

trap '' INT est censé ignorer les SIGINT pour le shell et tous ses enfants.

Mais en regardant strace sorties sur scp , il ressemble à scp installe son propre gestionnaire SIGINT qui annule le SIG_IGN ci-dessus.

La seule façon de l'empêcher d'obtenir le SIGINT serait de l'exécuter dans un groupe de processus différent comme avec :

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

ou

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

ou dites au pilote tty d'arrêter d'envoyer SIGINT sur Ctrl-C (comme avec stty -isig , ou stty intr '' pour ^C seul), bien que vous souhaitiez restaurer les paramètres par la suite :

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

Linux
  1. Empêcher un script bash de s'exécuter simultanément

  2. Détecter si la touche est enfoncée à partir du script ?

  3. Empêcher Tmux de démarrer sur Ssh ?

  4. Processus dans une session dans un shell interactif Vs dans un script ?

  5. Empêcher l'écran Gnu de mettre fin à la session une fois le script exécuté terminé ?

Ssh - Script pour automatiser Scp en réseau ?

Exécuter le script bash à partir de l'URL

Exécuter un script Python à partir de PHP

Exécuter Pycharm en tant que root depuis le lanceur

Exécutez un script de n'importe où

Comment Linux distingue-t-il les threads des processus enfants ?