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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.