2011-06-08 10 views
9

मेरे स्क्रिप्ट cdist तैनाती करने और cdist-बड़े पैमाने पर तैनाती (से cdist विन्यास प्रबंधन) सहभागी चला है (यानी एक उपयोगकर्ता द्वारा कहा जाता है)।बाधा पर वर्तमान खोल के सभी बच्चों को कैसे मारना है?

इन लिपियों लिपियों का एक बहुत फोन है, जो फिर से कुछ स्क्रिप्ट फोन:

cdist-mass-deploy ... 
    cdist-deploy-to ... 
     cdist-explorer-run-global ... 
      cdist-dir .... 

क्या मैं चाहता हूँ से बाहर निकलें/जैसे ही सभी स्क्रिप्ट को मारने, के रूप में cdist-बड़े पैमाने पर तैनाती या तो नियंत्रण सी द्वारा बंद कर दिया जाता है (SIGINT) या SIGTERM के साथ मारा गया।

cdist तैनाती करने को भी सहभागी कहा जा सकता है और एक ही व्यवहार प्रदर्शित करना चाहिए।

ps -ef का उपयोग करना ... और सह ppid साथ लगता है कि यह काफी unportable हो सकता है सभी प्रक्रियाओं पता लगाने के लिए वेरिएंट। $ का उपयोग करना! गहरे स्तर के रूप में काम नहीं करता है कि बच्चे पृष्ठभूमि प्रक्रिया नहीं हैं।

मैं निम्नलिखित कोड का उपयोग कर की कोशिश की:

__cdist_kill_on_interrupt() 
{ 
    __cdist_tmp_removal 
    kill 0 
    exit 1 
} 

trap __cdist_kill_on_interrupt INT TERM 

लेकिन इस बदसूरत समाप्त संदेशों के साथ ही गोले में एक segfault (पानी का छींटा, बैश, zsh) की ओर जाता है और तुरंत वैसे भी सब कुछ बंद करने के लिए नहीं लगता है:

# cdist-mass-deploy -p ikq04.ethz.ch ikq05.ethz.ch 
core: Waiting for cdist-deploy-to jobs to finish 
^CTerminated 
Terminated 
Terminated 
Terminated 
Segmentation fault 

तो सवाल, कैसे सफाई से सभी (उप) बच्चों एक पोर्टेबल ढंग से (बॉर्न शैल, कोई csh समर्थन की जरूरत) सहित बाहर निकलने के लिए किया जाता है?

+1

+1। लेकिन मैं infanticide पर चर्चा के बारे में थोड़ा चिंतित हूँ। – Hyperboreus

उत्तर

1

आप को संभालने के लिए^सी, कि एक संकेत का परिणाम देगा पूरी प्रक्रिया समूह है, जो सभी प्रक्रियाओं है कि पृष्ठभूमि में नहीं हैं मार देंगे करने के लिए भेजा जा रहा है की जरूरत नहीं है। तो आपको आईएनटी पकड़ने की जरूरत नहीं है।

एकमात्र कारण आप एक समाप्त जब आप उन्हें मारने मिलता है कि मार डिफ़ॉल्ट रूप से सावधि भेजता है, लेकिन यह उचित है कि अगर आप पहली जगह में एक शब्द है संभाल रहे हैं। यदि आप संदेशों से बचना चाहते हैं तो आप kill -INT 0 का उपयोग कर सकते हैं।

बच्चे प्रक्रियाओं पृष्ठभूमि में चलाए जा रहे हैं, तो आप अपनी प्रक्रिया आईडी प्राप्त कर सकते हैं बस जाने के बाद उन्हें शुरू करते हैं, $ का उपयोग कर (अतिरिक्त जानकारी के साथ जवाब)! विशेष खोल चर। इन्हें एक चर में एक साथ इकट्ठा करें और जब आपको समाप्त करने की आवश्यकता हो तो बस उन्हें मार दें।

+1

बहुत बहुत धन्यवाद! लेकिन, पृष्ठभूमि की प्रक्रियाओं के बारे में क्या? सीडीआईस्ट-मास-तैनाती बहुत सी सीडीआईस्ट-तैनाती प्रक्रियाओं को शुरू करती है, जो पृष्ठभूमि में हैं और 'प्रतीक्षा' का उपयोग करने के लिए प्रतीक्षा कर रहे हैं। – Nico