2017-09-05 12 views
8

İşte iki trap işleyicileri kaydeden kolay bir kullanım programı ve ardından trap -p ile görüntüler. Sonra aynı şeyi yapar, ancak çocuk arka plan sürecinde. bash: Neden arka plan kabuğunda SIGINT için bir tuzak kuramıyorum?

Neden arka plan işlemi SIGINT tuzak görmezden geliyor?

#!/bin/bash 

echo "Traps on startup:" 
trap -p 
echo "" 

trap 'echo "Received INT"' INT 
trap 'echo "Received TERM"' TERM 

echo "Traps set on parent:" 
trap -p 
echo "" 

(
    echo "Child traps on startup:" 
    trap -p 
    echo "" 

    trap 'echo "Child received INT"' INT 
    trap 'echo "Child received TERM"' TERM 

    echo "Traps set on child:" 
    trap -p 
    echo "" 
) & 

child_pid=$! 
wait $child_pid 

Çıktı: (bunlar üzerinde set -m ile backgrounded sürece)

$ ./show-traps.sh 
Traps on startup: 

Traps set on parent: 
trap -- 'echo "Received INT"' SIGINT 
trap -- 'echo "Received TERM"' SIGTERM 

Child traps on startup: 

Traps set on child: 
trap -- 'echo "Child received TERM"' SIGTERM 

cevap

6

SIGINT ve SIGQUIT backgrounded süreçlerinde göz ardı edilir. Bir (tuhaf) POSIX gereksinimi (daha fazla ayrıntı için bkz. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html veya SO sorumlusu Why do shells ignore SIGINT and SIGQUIT in backgrounded processes?).

bir altkabuk girilir

göz ardı edilmiyor tuzakları sadece tek içeren bir komut ikame durumlar dışında, varsayılan eylemlere kümesi olacaktır:

Ayrıca, POSIX gerektirir bunu göz ardı çünkü tuzak komutu ..

Ancak, bu sıfırlandı sonra tekrar alt kabukta INT işleyicisi set bile susbshell bunu almak mümkün olmayacaktır (bunu deneyebilirsiniz ya da inceleyebilir sinyalkullanarak göz ardı maskesi, örneğin).

+0

"set -m" üzerindeki bir parçayı genişletebilir misiniz - ne olduğunu ve nasıl yapılabileceğini? SIGINT'i bir bg sürecine gönderebileceğim bir çözüm arıyorum. Teşekkürler. – drevicko

+0

@revicko Manpage'de 'monitor' ifadesini arayın. Monitör modu ('set -m'), komutların (boru hatları) ayrı işlem gruplarında çalışmasına neden olur. Bunu istemeyebilirsin. Ancak, arka planda gerçekleştirilen bir işlemde bir yürütülebilir dosya çalıştırıyorsanız, SIGINT'i göz ardı eden bir sarmalayıcıdan (başka bir şey yapmadan) başlatmanız önemsizdir. (Eğer bunu nasıl yapacağınızı bilmiyorsanız, araştırmayı akse edin ve kodu postalayacağım.) – PSkocik

+0

Çok teşekkürler! Soru şu: [https://stackoverflow.com/questions/49178556/how-do-i-launch-a-background-process-through-a-wrapper-thatll-undo-the-sigint-i). – drevicko