टर्मिनल को बंद किए बिना टर्मिनल में चल रही स्क्रिप्ट को कैसे मारना है (Ctrl + C काम नहीं करता है)?


36

मैंने एक बैश स्क्रिप्ट लिखी है जो कई अन्य कार्यक्रमों को बुलाती है और आदेशों के एक समूह को निष्पादित करती है। मैं इस स्क्रिप्ट को टर्मिनल से चलाता हूं। अब मैं स्क्रिप्ट को मारना चाहता हूं।

Ctrl + Cकभी-कभी दबाने से इसमें कटौती नहीं होती है, मुझे लगता है क्योंकि कभी-कभी स्क्रिप्ट किसी अन्य प्रोग्राम को निष्पादित कर रही है, और किसी कारण से किल सिग्नल काम नहीं करता है।

हालांकि, अगर मैं टर्मिनल विंडो को बंद करता हूं, तो यह स्क्रिप्ट को मारता है।

क्या ऐसा कुछ है जो मैं कर सकता हूं (एक कीबोर्ड संयोजन), जो टर्मिनल विंडो को बंद करने के अनुरूप है, वास्तव में टर्मिनल विंडो को बंद किए बिना (मैं कमांड इतिहास, वर्तमान निर्देशिका, आउटपुट इतिहास, आदि को खोना नहीं चाहता)?


8
ऐसे मामलों में मैं कोशिश करता हूँCtrl + z
kenn

और Ctrl + zरन के बाद :kill -9 $(pgrep -f your_script.sh)
नोम मानोस

जवाबों:


38

आपके पास कुछ विकल्प हैं। एक स्क्रिप्ट को रोकना है ( CtrlZ), स्क्रिप्ट की पीआईडी ​​प्राप्त करें और SIGKILLप्रक्रिया समूह को भेजें ।

जब एक कमांड को एक शेल में निष्पादित किया जाता है, तो यह प्रक्रिया शुरू होती है और उसके सभी बच्चे उसी प्रक्रिया समूह (इस मामले में, अग्रभूमि प्रक्रिया समूह) का हिस्सा होते हैं। इस समूह में सभी प्रक्रियाओं के लिए एक संकेत भेजने के लिए, आप इसे प्रक्रिया नेता को भेजते हैं। के लिए killआदेश, प्रक्रिया नेता इस प्रकार प्रदर्शित किया जाता है:

kill -PID

PIDस्क्रिप्ट की प्रोसेस आईडी कहां है।

उदाहरण:

एक स्क्रिप्ट पर विचार करें test.shजो कुछ प्रक्रियाओं को लॉन्च करती है। कहो कि आप इसे एक खोल में भाग गया:

$ ./test.sh

दूसरे टर्मिनल में,

$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
                                                                               ├─sleep(17805)
                                                                               └─yes(17803)

इस स्थिति में test.sh, आपके द्वारा बनाए गए प्रक्रिया समूह को संकेत भेजने के लिए , आप यह करेंगे:

kill -INT -17802

-INTभेजने के लिए उपयोग किया जाता है SIGINT, और इसलिए यह आदेश CtrlCटर्मिनल पर दबाने के बराबर है । भेजने के लिए SIGKILL:

kill -KILL -17802

यदि आपको कोई अन्य टर्मिनल नहीं खोल सकता है, तो आपको केवल स्क्रिप्ट को रोकने की आवश्यकता है। यदि आप कर सकते हैं, pgrepपीआईडी ​​खोजने के लिए उपयोग करें।

स्क्रिप्ट लॉन्च करने वाला एक आदेश फंस सकता है SIGINT, जो शायद CtrlCअप्रभावी है। हालाँकि, SIGKILLइसे फँसाया नहीं जा सकता है, और यह आमतौर पर एक अंतिम उपाय है। आप मारने के लिए जाने से पहले SIGTERM( -TERM) कोशिश कर सकते हैं । न तो SIGKILLया SIGTERMस्थापित किया जा सकता के रूप में एक , कीबोर्ड शॉर्टकट रास्ता SIGINTहै।

यदि आपकी लिपि में कोई शबंग रेखा नहीं है, तो यह सब लूट है। से इस अतः जवाब :

आमतौर पर अभिभावक शेल का अनुमान है कि स्क्रिप्ट उसी शेल के लिए लिखी गई है (न्यूनतम बॉर्न-जैसे गोले स्क्रिप्ट को / बिन / श के साथ चलाते हैं, बैश इसे बैश सबप्रोसेस के रूप में चलाता है) ...

इसके कारण, जब स्क्रिप्ट निष्पादित होती है, तो आपको स्क्रिप्ट के नाम पर एक प्रक्रिया नहीं मिलेगी (या कमांड लाइन में स्क्रिप्ट के नाम के साथ एक प्रक्रिया) और pgrepविफल हो जाएगी।

हमेशा एक शेबंग लाइन का उपयोग करें।


के लिए एक कीबोर्ड संयोजन है SIGKILLया SIGTERM?
बेको

@becko नहीं, और आप एक सेट नहीं कर सकते: superuser.com/a/417991/334516
muru

pgrep test.shमेरे लिए पीआईडी ​​वापस नहीं करता है। मैंने एक साधारण परीक्षण की कोशिश की। एस: for i in {1..30}; do sleep 1 echo $i done जबकि test.shचल रहा है, मैं pgrep test.shदूसरे टर्मिनल में निष्पादित करता हूं , लेकिन कुछ भी नहीं लौटाया जाता है। क्या गलत है?
बेको

1
@becko आपने स्क्रिप्ट को कैसे चलाया? इसके अलावा प्रयास करें pgrep -f test.sh
मूरू

pgrep -f test.shया तो काम नहीं करता है। मैं पटकथा के साथ ./test.sh
चलाता हूं

6

यदि आप उन प्रक्रियाओं को जानते हैं जो स्क्रिप्ट से जुड़ी हैं तो आप उनके पीआईडी ​​का उपयोग कर पा सकते हैं

 ps -A

और फिर उपयोग कर संबंधित प्रक्रियाओं को मारने के लिए PID नंबर का उपयोग करें

 kill -9 PID_Number

1
यह बहुत जटिल है। स्क्रिप्ट कई अन्य कार्यक्रमों को जन्म देती है, और ये कार्यक्रम समानांतर प्रक्रिया भी शुरू करते हैं। इन सभी प्रक्रियाओं पर नज़र रखना बहुत कठिन है। एक सरल समाधान होना चाहिए, जब आप टर्मिनल विंडो को बंद करते हैं तो कुछ समान होता है।
बेको

क्या आप pkill कोशिश कर सकते हैं
हैरिस

1

जैसा कि हैरिस ने कहा कि आप चला सकते हैं Kill -9 PID_Numberलेकिन आप htopएक संवादात्मक प्रक्रिया ब्राउज़र के रूप में ज्ञात पैकेज को भी स्थापित कर सकते हैं जो विशिष्ट प्रक्रियाओं को खोजने में बहुत आसान बनाता है। htop भी हत्या प्रक्रियाओं का समर्थन करता है।

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