2009-06-10 13 views
6

पर बच्चों को समाप्त करें, मैं एक शेल स्क्रिप्ट लिखना चाहता हूं जो पृष्ठभूमि में कई लंबी चल रही प्रक्रियाओं को जन्म देती है, फिर आसपास लटकती है। SIGTERM प्राप्त करने पर, मैं चाहता हूं कि सभी उपप्रोसेस भी समाप्त हो जाएं।शैल स्क्रिप्ट को प्रक्रियाओं को बढ़ाने के लिए, SIGTERM

असल में, मुझे "मास्टर प्रोसेस" चाहिए।

यहाँ मैं अब तक क्या मिला है:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait 

ऊपर स्क्रिप्ट trap: 10: SIGTERM: bad trap साथ विफल रहता है।

संपादित करें: मैं Ubuntu 9.04

उत्तर

5

जो के जवाब ने मुझे सही रास्ते पर रखा। मुझे यह भी पता चला कि मुझे अपने अड्डों को कवर करने के लिए और अधिक संकेतों को फंसाना चाहिए।

अंतिम स्क्रिप्ट इस तरह दिखता है:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

में बदलता हूं यदि आपको लगता है कि आपको सिग्नल नंबर का उपयोग करना है, तो आपको केवल मानकीकृत लोगों का उपयोग करना चाहिए। लेकिन मैं इसके बजाय आपके सिस्टम के सिग्नल नामों का उपयोग करने के लिए परेशान हूं। – TheBonsai

+0

आप सही हैं। मुझे उम्मीद है कि यह आखिरी संस्करण है ... – itsadok

+0

अच्छा, यह आपका कोड है, आप जितने चाहें उतने संस्करण प्राप्त कर सकते हैं ;-) – TheBonsai

1

उपयोग कर रहा हूँ यह स्क्रिप्ट सही लग रहा है और उम्मीद के रूप में मेरे लिए काम करता है।

आप "मास्टर प्रक्रिया" में SIGTERM सिग्नल कैसे भेजते हैं? शायद आपको सिग्नल समर्थित होने की जांच करने के लिए kill -l निष्पादित करना चाहिए। त्रुटि संदेश बताता है कि आप सिग्नल "10" भेजते हैं जिसे आपका सिस्टम पहचानने के लिए प्रतीत नहीं होता है।

और अगली बार जब आप इस तरह के एक प्रश्न के लिए ऑपरेटिंग सिस्टम, खोल संस्करण, गिरी, ... जोड़ना चाहिए

+0

प्रतिक्रिया के लिए धन्यवाद। मैं उबंटू 9.04 का उपयोग कर रहा हूं, और अपना जवाब पढ़ रहा हूं, मुझे एहसास हुआ कि यह शायद एक बैश बनाम डैश चीज था। यह वास्तव में विज्ञापन के रूप में काम करता है अगर मैं पहली पंक्ति #!/Bin/bash – itsadok

4

मुझे लगता है अपने/bin/sh एक बैश नहीं है (यदि आप 'बैश' के रूप में प्रश्न में चिह्नित यद्यपि)।

संदेश से मुझे लगता है कि यह एक DASH है। यदि आपको बैश कोड लिखना है तो मैन्युअल जांचें या बस अपने शेबांग को ठीक करें।

10

यह मेरे लिए काम करता है:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$ पूरी प्रक्रिया समूह के लिए एक SIGTERM भेजता है, इस प्रकार भी सन्तान मौत हो गई।

  • EXIT निर्दिष्ट करते समय set -e (अधिक जानकारी here) का उपयोग करते समय सिग्नल निर्दिष्ट करना EXIT उपयोगी है।

+0

पिड 0 का क्या अर्थ है? और क्या आपका मतलब '...' सचमुच, या प्लेसहोल्डर के रूप में है? – itsadok

+0

किसी भी तरह से यह केवल मेरे लिए काम करता था जब मैंने 'kill - 0 $' के स्थान पर 'kill - 0' का उपयोग किया था। उत्तरार्द्ध ने कहा कि कुछ कारणों से '11641: कोई प्रक्रिया नहीं मिली'। – WorldSEnder

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