बैश स्क्रिप्ट को केवल दूसरी स्क्रिप्ट के उन उदाहरणों को मारना चाहिए जो उसने लॉन्च किया है


11

वर्तमान स्थिति में, एक निश्चित स्क्रिप्ट 'कॉलिंग। एसश' पृष्ठभूमि में एक और स्क्रिप्ट 'कहलाता है।' की शुरुआत करता है, अन्य ऑपरेशन करता है, थोड़ी देर के लिए सोता है, और फिर एक के साथ 'call.sh' को समाप्त करता है pkill called.sh। यह ठीक काम करता है।

फिर, मैं अन्य टर्मिनलों से 'call.sh' को किसी अन्य समय पर एक स्टैंडअलोन स्क्रिप्ट के रूप में लॉन्च करना चाहूंगा, चाहे कॉलिंग शुरू करने से पहले या बाद में। इन स्वतंत्र उदाहरणों को 'call.sh' द्वारा नहीं मारा जाना चाहिए

इसे कैसे प्राप्त किया जा सकता है? अंतर्ज्ञान का कहना है कि कॉलिंग स्क्रिप्ट को उस प्रक्रिया को बताने में सक्षम होना चाहिए जो इस बीच किसी अन्य नाम से शुरू हुई थी।

एक प्रकार के रूप में, 'कॉलिंग.श' भी 'नामक' को लॉन्च कर सकता है, जो 'कॉल' 'एस' का एक प्रतीकात्मक लिंक है। क्या यह उपर्युक्त स्थिति को प्रबंधित करता है? प्रतीकात्मक लिंक का उपयोग करके किन विशिष्ट सावधानियों और समायोजन की आवश्यकता होती है?


1
मेरा मानना ​​है कि इसके लिए विशेष रूप से unshare है
Rusi

जवाबों:


27

इसे मारने के लिए नाम का उपयोग न करें। चूंकि calling.shस्क्रिप्ट उस प्रक्रिया को बुला रही है जिसे आप बाद में मारना चाहते हैं, बस उपयोग करें $!(से man bash):

! नौकरी की प्रक्रिया आईडी में सबसे हाल ही में पृष्ठभूमि में रखा गया है, चाहे वह एक अतुल्यकालिक कमांड के रूप में निष्पादित हो या bgबिलिन का उपयोग कर

तो, यदि आप calling.shइस तरह हैं:

called.sh &
## do stuff
pkill called.sh

इसे इसमें बदलें:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

4
यह तब तक काम करना चाहिए जब तक कि call.sh खुद से नहीं मर जाता है, क्योंकि अन्यथा इसके पिड का पुन: उपयोग किया जा सकता है, परिणामस्वरूप एक निर्दोष और असंबंधित प्रक्रिया को मार दिया जाता है।
यूजीन रयबत्सेव

2
@EugeneRyabtsev यह एक बहुत अच्छी बात है। मुझे लगता है कि आप यह भी देख सकते हैं कि $calledPidमाता-पिता का पीआईडी ​​पीआईडी ​​है called.sh
terdon

उत्तर को सुदृढ़ करने के लिए, यह एक और संसाधन है जिसे मैंने अपने विचारों को व्यवस्थित करने के लिए उपयोगी पाया: mywiki.wooledge.org/ProcessManagement
XavierStuvw

18

मुझे इसे कई बार स्क्रिप्ट से बाहर निकालना पड़ा है; जब स्क्रिप्ट को एक जटिल स्वचालित अनुसूची के भाग के रूप में कहा जाता है तो यह और भी मज़ेदार होता है। आपको वास्तव में इस बात पर भरोसा नहीं करना चाहिए कि pkillकिस स्क्रिप्ट को चुनना है।

कॉलिंग के अंदर। आपको उन नौकरियों के पीआईडी ​​को रिकॉर्ड करना चाहिए जिन्हें आपने शुरू किया है और पीआईडी ​​द्वारा उन्हें स्पष्ट रूप से मार दिया है।

Call.sh के अंदर:

./called.sh &
called_pid=$!

# Later
kill $called_pid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.