2015-10-20 5 views
6

मेरे पास एक बैश स्क्रिप्ट है जो अग्रभूमि में लंबी चल रही प्रक्रिया चलाती है। जब इसे एक सिग्क्विट सिग्नल प्राप्त होता है, तो इसे विभिन्न सफाई कार्यों को निष्पादित करना चाहिए जैसे कि खुद और सभी बाल प्रक्रियाओं को मारना (प्रक्रिया समूह आदि के मारने के माध्यम से)। (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 की प्रक्रिया को संकेत दिया गया था जब जाल केवल तभी आग लग जाएगा?

मैं अनचाहे सिगकिल का उपयोग नहीं करना चाहता क्योंकि मुझे जाल अभिव्यक्ति में क्लीनअप संचालन के वर्गीकरण की आवश्यकता है।

यह स्क्रिप्ट बैश युक्त किसी भी लिनक्स वितरण के किसी भी हाल के संस्करण पर चलाना है (उदाहरण के लिए, सिगविन नहीं)।

संदर्भ:

  1. killing Parent process along with child process using SIGKILL
  2. Kill bash and child process

उत्तर

6

bash को sleep के लिए हैंडलर निष्पादित करने से पहले पूरा करने के लिए प्रतीक्षा करनी होगी। पृष्ठभूमि में sleep चलाने के लिए एक अच्छा कामकाज है, फिर तुरंत इसके लिए प्रतीक्षा करें। जबकि sleep अनइंटरप्टिबल है, wait नहीं है।

trap 'kill $sleep_pid; echo "TRAP CAUGHT"; exit 1' QUIT 

echo starting sleep 
sleep 11666 & 
sleep_pid=$! 
wait 
echo ending sleep 

echo done 

sleep_pid की रिकॉर्डिंग और इसे का उपयोग हैंडलर से sleep को मारने के लिए वैकल्पिक हैं।

+1

मुझे इसे मेरे प्रश्न से पूछने के बाद इसे जवाब के रूप में चिह्नित करना होगा और यह काफी उपयोगी था। हालांकि, मैंने कहा "यह प्रक्रिया वास्तव में एक इंटरैक्टिव सबहेल (उदा।, बाश -आई) हो सकती है।" और मुझे यह जोड़ना चाहिए था कि "मैं पृष्ठभूमि में प्रतिनिधि प्रक्रिया नहीं रखना चाहता क्योंकि यह एक इंटरैक्टिव खोल हो सकता है"। – bgoodr

+0

ध्यान रखें कि इंटरैक्टिव सबशेल का उपयोगकर्ता कॉलर द्वारा शेल बाधित होने से बचने के लिए वैसे भी अपने स्वयं के जाल सेट कर सकता है। – chepner

+0

@bgoodr क्या आपको कभी ऐसा समाधान मिला है जिस पर प्रक्रिया को पृष्ठभूमि में डालने की आवश्यकता नहीं है? – trex005

1

दरअसल, पार्टी संकेत प्राप्त कर रहा है, लेकिन यह एक अबाधित राज्य अंत करने के लिए sleep आदेश के लिए इंतज़ार कर रही है। जब यह समाप्त होता है, तो बैश सिग्नल पर प्रतिक्रिया करेगा और जाल को निष्पादित करेगा।

while true 
do 
    sleep 1 
done 

इसके साथ ही, यदि आप बैश प्रक्रिया के लिए संकेत भेजने के लिए, यह रूप में जल्द ही वर्तमान में क्रियान्वित sleep आदेश के रूप में प्रतिक्रिया करेंगे:

आप कम sleep आदेशों की एक पाश के साथ लंबे समय sleep आदेश जगह ले सकता है समाप्त होता है, यानी, इसे भेजने के बाद लगभग 1 सेकंड पर होता है।

संकेत SIGINT (समान जो Ctrl + C दबाकर भेज दिया जाता है) SIGKILL के बजाय साथ
+0

धन्यवाद लेकिन http://stackoverflow.com/questions/33240221/how-to-use-trap-reliably-using-bash-running-foreground-child-processes#comment54286155_33241062 पर मेरी प्रतिक्रिया देखें @ chepner के उत्तर के अनुसार । यदि सो रहा था तो मैं बस इतना करना चाहता था, तो आपका जवाब पर्याप्त होगा, लेकिन यह सिर्फ एक प्रतिनिधि प्रक्रिया है कि मैं आदर्श रूप से अग्रभूमि में दौड़ने की अनुमति देना चाहूंगा क्योंकि यह एक इंटरैक्टिव 'बाश -आई' प्रक्रिया हो सकती है। – bgoodr

0

प्रयास करें। अन्य सिग्नल केवल तभी काम करते हैं जब बैश I/O या किसी अन्य स्थिति को संसाधित कर सकता है।

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