2014-12-29 12 views
16

Sto cercando di catturare il segnale SIGUSR1 in uno script bash che sta dormendo tramite il comando sleep:interrompere il sonno in bash con una trappola segnale

#!/bin/bash 

trap 'echo "Caught SIGUSR1"' SIGUSR1 

echo "Sleeping. Pid=$$" 
while : 
do 
    sleep 10 
    echo "Sleep over" 
done 

il segnale di opere trappola, ma il messaggio è sentimento è condiviso non visualizzato finché non è terminato lo sleep 10.
Appare che la gestione del segnale di bash attende fino a quando il comando corrente è terminato prima di elaborare il segnale.

C'è un modo per interrompere il comando in esecuzione sleep non appena riceve il segnale, allo stesso modo in cui un programma C interromperà la funzione libc sleep()?

risposta

18
#!/bin/bash 

trap 'echo "Caught SIGUSR1"' SIGUSR1 

echo "Sleeping. Pid=$$" 
while : 
do 
    sleep 10 & 
    wait $! 
    echo "Sleep over" 
done 
+8

Alcuni [info rilevanti] (http://mywiki.wooledge.org/SignalTrap#When_is_the_signal_handled.3F) – iruvar

+1

Sostituire 10 con l'infinito, come "infinito sleep &" – gregoiregentil

+0

@iruvar tuo link vale il suo peso in oro. non essere in grado di interrompere un sonno da un processo diverso * molto molto molto contro-intuitivo *. –

2

Nota che

sleep infinity & 
wait 

mette il sonno in background, e ferma l'attesa con il segnale. Questo lascia un sonno infinito dietro ogni segnale!

Sostituire il sonno e attendere con

read 

e vi andrà bene.

+0

Non penso che lasci sospeso un processo in background, almeno non su MacOS 10.12. – frnhr

6

Solo un punto per il wait dopo la sleep perché ho appena fatto questo errore nel mio script:

si dovrebbe usare wait $! invece di wait se, all'interno del vostro script, è già lanciato altri I processi in background

Ad esempio, il wait all'interno del prossimo frammento di codice sarà attendere per la cessazione o f sia process_1 e sleep 10:

process_1 & 
    ... 
sleep 10 & 
wait 

Se si utilizza, invece di wait, wait $! lo script attenderà solo per sleep 10, perché $! significa PID dell'ultimo processo in background.

+0

Grazie mille! Ho cambiato la mia risposta come suggerito da voi. –

Problemi correlati