Ctrl-C negli script bash


22

Come posso implementare la gestione ctrl+ cnegli script bash in modo che lo script venga interrotto, così come il comando attualmente in esecuzione lanciato dallo script?

(Immagina che ci sia uno script che esegue un comando di lunga durata. L'utente preme ctrl+ ce interrompe il comando, ma lo script procede.) Ho bisogno che si comporti in modo che entrambi vengano uccisi.


1
Se il tuo sistema operativo ha il controllo del lavoro abilitato, un'altra opzione sarebbe quella di fermare quello script (di solito con crtl-z). Puoi continuare quel lavoro in background con bg, ucciderlo o continuare in primo piano con fg. Vedi la sezione manpage di bash JOB CONTROL.
ott--

Risposte:


25

Puoi farlo creando una subroutine che desideri chiamare quando viene ricevuto SIGINT ed è necessario eseguirlo trap 'subroutinename' INT.

Esempio:

#!/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
Nota che puoi anche intercettare EXITnei casi in cui hai qualcosa che vuoi eseguire ogni volta che lo script esce indipendentemente da come si è fermato. ( KILLeccetto, ovviamente.)
Blrfl,

Grazie mille! Tuttavia, quando "sleep" viene interrotto, la shell potrebbe essere ancora in grado di eseguire il comando successivo mentre è in esecuzione la routine trap: "echo" in questo caso ... o sbaglio?
Kolypto,

Ciò non dovrebbe essere possibile, no. Non esegue attività in parallelo.
Kvisle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.