2013-04-03 15 views
19

E 'possibile in bash intercettare un SIGINT, fare qualcosa, e quindi ignorarlo (mantenere bash in esecuzione).Catch SIGINT in bash, handle AND ignora

so che posso ignorare il SIGINT con

trap '' SIGINT 

E posso anche fare qualcosa sul SIGINT con

trap handler SIGINT 

ma che ancora fermare lo script dopo le handler esegue. Per esempio.

#!/bin/bash 

handler() 
{ 
    kill -s SIGINT $PID 
} 

program & 
PID=$! 

trap handler SIGINT 

wait $PID 

#do some other cleanup with results from program 

Quando si preme Ctrl + c, verrà inviato il SIGINT al programma, ma bash salterà la wait PRIMA programma è stato chiuso correttamente e ha creato la sua uscita nel suo gestore di segnale.

Utilizzando risposta @suspectus posso cambiare il wait $PID a:

while kill -0 $PID > /dev/null 2>&1 
do 
    wait $PID 
done 

Questo funziona in realtà per me sono sicuro che appena non al 100%, se questo è 'pulito' o di una 'soluzione sporca'.

+2

perché dovrebbe stampare più volte? – cnicutar

+0

@cnicutar: Se preme ctrl + c più volte (cosa che non posso nel modulo corrente, perché si ferma dopo il primo) – Zulan

+0

Ho cambiato il mio esempio per essere più vicino al caso d'uso reale. – Zulan

risposta

4

trap verrà restituito dal gestore, ma dopo il comando chiamato quando è stato richiamato il gestore.

Quindi la soluzione è un po 'maldestra, ma penso che faccia ciò che è richiesto. trap handler INT funzionerà anche.

trap 'echo "Be patient"' INT 

for ((n=20; n; n--)) 
do 
    sleep 1 
done 
+0

1. Non funziona; 2. Questo probabilmente non è ciò che l'utente desidera. – anishsane

+0

Se il trap viene attivato (per fare ciò, è necessario sostituire 'sleep 1' con' sleep 1 & wait'), il loop termina dopo aver premuto Control-C; non si continua a correre dove si è verificato il segnale dopo il ritorno della trappola. – chepner

+1

@anishsane 2. cosa vuole l'utente? Pensavo che l'utente volesse intrappolare SIGINT e mantenere il controllo del suo script. – suspectus