2017-09-05 2 views
8

यहां एक साधारण प्रोग्राम है जो दो trap हैंडलर पंजीकृत करता है और फिर उन्हें trap -p के साथ प्रदर्शित करता है। फिर यह वही काम करता है, लेकिन एक बच्चे की पृष्ठभूमि प्रक्रिया में।बैश: मैं पृष्ठभूमि खोल में SIGINT के लिए जाल क्यों नहीं लगा सकता?

पृष्ठभूमि प्रक्रिया SIGINT जाल को अनदेखा क्यों करती है?

#!/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 

आउटपुट:

$ ./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 

उत्तर

6

SIGINT और SIGQUIT backgrounded प्रक्रियाओं में अनदेखी कर रहे हैं (जब तक कि वे set -m पर साथ backgrounded रहे हैं)। यह एक (अजीब) POSIX आवश्यकता है (अधिक जानकारी के लिए http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html या मेरे SO प्रश्न Why do shells ignore SIGINT and SIGQUIT in backgrounded processes? देखें)।

साथ ही, POSIX की आवश्यकता है कि:

जब एक subshell दर्ज किया गया है, जाल जिसे अनदेखा नहीं किया जा रहा है डिफ़ॉल्ट कार्रवाई करने के लिए सेट किया जाएगा, एक कमांड केवल एक ही युक्त प्रतिस्थापन के मामले को छोड़कर जाल आदेश ..

हालांकि, अगर आप subshell फिर बाद यह रीसेट किया गया था में INT हैंडलर सेट करने के बावजूद, susbshell नहीं इसे प्राप्त करने में सक्षम है क्योंकि यह नजरअंदाज कर दिया है हो जाएगा (आप इसे कोशिश कर सकते हैं या आप निरीक्षण कर सकते हैं संकेतका उपयोग कर मास्क को अनदेखा करता है, उदाहरण के लिए)।

+0

क्या आप 'set -m' पर थोड़ा सा विस्तार कर सकते हैं - यह क्या है और यह कैसे किया जा सकता है? मैं एक कामकाज की तलाश में हूं जिसके द्वारा मैं एक बीजी प्रक्रिया में सिगिनट भेज सकता हूं। धन्यवाद। – drevicko

+0

@revicko मैनपेज में 'मॉनिटर' के लिए खोजें। मॉनिटर मोड ('set -m') अलग-अलग प्रक्रिया समूहों में चलाने के लिए कमांड (पाइपलाइन) का कारण बनता है। आप शायद यह नहीं चाहते हैं। हालांकि, अगर आप पृष्ठभूमि प्रक्रिया में निष्पादन योग्य चल रहे हैं, तो इसे एक रैपर के माध्यम से लॉन्च करना मुश्किल है जो SIGINT को अनदेखा कर देगा (कुछ और किए बिना)। (यदि आपको नहीं पता कि यह कैसे करना है, तो खोज करें, और मैं कोड पोस्ट करूंगा।) – PSkocik

+0

बहुत धन्यवाद! सवाल यह है [यहां] (https://stackoverflow.com/questions/49178556/how-do-i-launch-a-background-process-through-a-wrapper-thatll-undo-the-sigint-i)। – drevicko

संबंधित मुद्दे