मेरे पास एक बैश स्क्रिप्ट है जो अग्रभूमि में लंबी चल रही प्रक्रिया चलाती है। जब इसे एक सिग्क्विट सिग्नल प्राप्त होता है, तो इसे विभिन्न सफाई कार्यों को निष्पादित करना चाहिए जैसे कि खुद और सभी बाल प्रक्रियाओं को मारना (प्रक्रिया समूह आदि के मारने के माध्यम से)। (test_trap.sh
कहा जाता है) एक न्यूनतम स्क्रिप्ट, कि संकेत पकड़ने चाहिए, नीचे दिखाया गया है:बैश चलने वाले अग्रभूमि बाल प्रक्रियाओं का उपयोग करके भरोसेमंद जाल का उपयोग कैसे करें
#!/bin/bash
trap 'echo "TRAP CAUGHT"; exit 1' QUIT # other required signals are omitted for brevity
echo starting sleep
sleep 11666
echo ending sleep
echo done
मैं test_trap.sh
स्क्रिप्ट की प्रक्रिया के लिए SIGHUP संकेत भेजने के लिए चाहते हैं। हालांकि, test_trap.sh
पर एक SIGHUP भेजना जाल अभिव्यक्ति को ट्रिगर नहीं करता है, लेकिन केवल जब मैं बच्चे को सिग्नल भेजता हूं sleep 11666
प्रक्रिया जाल आग लगती है।
bash-4.1$ test_trap.sh &
[1] 19633
bash-4.1$ starting sleep
bash-4.1$ kill -s SIGQUIT 19633
bash-4.1$ jobs
[1]+ Running test_trap.sh &
bash-4.1$ ps -ef --forest --cols=10000 | grep '11666\|test_trap.sh' | grep -v grep
theuser 19633 12227 0 07:40 pts/4 00:00:00 \_ /bin/bash ./test_trap.sh
theuser 19634 19633 0 07:40 pts/4 00:00:00 | \_ sleep 11666
bash-4.1$ kill -s SIGQUIT 19634
bash-4.1$ Quit (core dumped)
TRAP CAUGHT
[1]+ Exit 1 test_trap.sh
bash-4.1$ ps -ef --forest --cols=10000 | grep '11666\|test_trap.sh' | grep -v grep
bash-4.1$
ध्यान दें कि "नींद 11,666" बस एक प्रतिनिधि प्रक्रिया है: नीचे एक बैश सत्र इस प्रदर्शन है। यह प्रक्रिया वास्तव में एक इंटरैक्टिव सबहेल हो सकती है (उदा।, bash -i
)।
माता-पिता test_trap.sh
प्रक्रिया SIGHUP सिग्नल को क्यों नहीं पकड़ती है? sleep 11666
की प्रक्रिया को संकेत दिया गया था जब जाल केवल तभी आग लग जाएगा?
मैं अनचाहे सिगकिल का उपयोग नहीं करना चाहता क्योंकि मुझे जाल अभिव्यक्ति में क्लीनअप संचालन के वर्गीकरण की आवश्यकता है।
यह स्क्रिप्ट बैश युक्त किसी भी लिनक्स वितरण के किसी भी हाल के संस्करण पर चलाना है (उदाहरण के लिए, सिगविन नहीं)।
संदर्भ:
मुझे इसे मेरे प्रश्न से पूछने के बाद इसे जवाब के रूप में चिह्नित करना होगा और यह काफी उपयोगी था। हालांकि, मैंने कहा "यह प्रक्रिया वास्तव में एक इंटरैक्टिव सबहेल (उदा।, बाश -आई) हो सकती है।" और मुझे यह जोड़ना चाहिए था कि "मैं पृष्ठभूमि में प्रतिनिधि प्रक्रिया नहीं रखना चाहता क्योंकि यह एक इंटरैक्टिव खोल हो सकता है"। – bgoodr
ध्यान रखें कि इंटरैक्टिव सबशेल का उपयोगकर्ता कॉलर द्वारा शेल बाधित होने से बचने के लिए वैसे भी अपने स्वयं के जाल सेट कर सकता है। – chepner
@bgoodr क्या आपको कभी ऐसा समाधान मिला है जिस पर प्रक्रिया को पृष्ठभूमि में डालने की आवश्यकता नहीं है? – trex005