Ctrl-C dans les scripts bash

22

Comment puis-je implémenter ctrl+ la cgestion dans les scripts bash afin que le script soit interrompu, ainsi que la commande en cours d'exécution lancée par le script?

(Imaginez qu'il existe un script qui exécute une commande de longue durée. L'utilisateur frappe ctrl+ cet interrompt la commande, mais le script continue.) J'ai besoin qu'il se comporte de manière à ce qu'ils soient tous les deux tués.

kolypto
la source
1
Si le contrôle des travaux est activé sur votre système d'exploitation, une autre option serait d'arrêter ce script (généralement avec crtl-z). Vous pouvez continuer ce travail en arrière-plan avec bg, le tuer ou le continuer en premier plan avec fg. Voir la section de page de manuel bash JOB CONTROL.
ott--

Réponses:

25

Pour ce faire, créez un sous-programme que vous souhaitez appeler lorsque SIGINT est reçu et que vous devez exécuter trap 'subroutinename' INT.

Exemple:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0
Kvisle
la source
2
Notez que vous pouvez également intercepter EXITdans les cas où vous avez quelque chose que vous souhaitez exécuter à chaque fois que le script se termine, quelle que soit la façon dont il s'est arrêté. ( KILLsauf, bien sûr.)
Blrfl
Grand merci! Cependant, lorsque «sleep» est tué - le shell peut toujours réussir à exécuter la commande suivante pendant que la routine de trap est en cours d'exécution: «echo» dans ce cas ... ou je me trompe?
kolypto
Cela ne devrait pas être possible, non. Il n'exécute pas de tâches en parallèle.
Kvisle