2014-12-29 29 views
16

Ben sleep komutu aracılığıyla uyuyor bir bash komut SIGUSR1 sinyali yakalamaya çalışıyorum:kesme uyku

#!/bin/bash 

trap 'echo "Caught SIGUSR1"' SIGUSR1 

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

sinyal kapanı eserler, ancak ileti olmak yankılanır sleep 10 bitene kadar görüntülenmez.
Bash sinyal işleme, mevcut komut sinyal işlenmeden önce bitene kadar bekler.

Sinyal geldiği anda çalışan sleep komutunu kesmeye çalışmanın bir yolu var mı, bir C programı libc sleep() işlevini kesintiye uğratır mı?

sleep infinity & 
wait 

arka planda uyku koyar ve sinyal ile bekleme durdurur

cevap

18
#!/bin/bash 

trap 'echo "Caught SIGUSR1"' SIGUSR1 

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

Bazı [İlgili bilgi] (http://mywiki.wooledge.org/SignalTrap#When_is_the_signal_handled.3F) – iruvar

+1

böyle "uyku sonsuz &" – gregoiregentil

+0

bağlantı değer @iruvar kilo altın var olarak sonsuza tarafından 10 değiştirin. Bir uykuyu farklı bir süreçten kesememek * çok çok karşı-sezgisel *. –

2

Açıklama. Bu, her sinyalin arkasında sonsuz bir uyku bırakır!

uyku değiştirin ve

read 

ile bir dur ve iyi olacak.

+0

En azından MacOS 10.12'de asılı olmayan bir arka plan işlemi bıraktığını sanmıyorum. – frnhr

6

sleep sonra wait hakkında sadece bir nokta sadece benim senaryodaki bu hatayı yaptık çünkü: senin komut dosyası içinde, zaten diğer başlattı eğer

Sen wait $! yerine wait kullanmalıdır arka planda

Örneğin

, kodun bir sonraki pasajı içindeki wait süreçler sonlandırma o için bekleyecek f hem process_1 ve sleep 10:

process_1 & 
    ... 
sleep 10 & 
wait 

kullanırsanız $! son backgrounded sürecin ait PID demektir, çünkü yerine wait arasında wait $! senaryonuz, sleep 10 için sadece bekler.

+0

Çok teşekkürler! Cevabınızı sizin tarafınızdan önerildiği gibi değiştirdim. –