Ctrl-Z और किल -STOP में क्या अंतर है?


14

जब मैं makeशेल से कमांड ( एक बड़े प्रोजेक्ट पर) चलाता हूं , तो मैं प्रक्रिया को रोकने और शेल पर वापस जाने के लिए Ctrl-Z टाइप कर सकता हूं। इसके बाद, मैं fgइस प्रक्रिया को जारी रखने के लिए दौड़ सकता हूं ।

मैं इसे स्वचालित करने के लिए एक शेल स्क्रिप्ट लिखने की कोशिश कर रहा हूं (विशेष रूप से, मेरे सीपीयू तापमान को हर कुछ सेकंड में जांचने के लिए और प्रक्रिया को रोक दें यदि यह बहुत गर्म हो जाता है, क्योंकि मेरा कंप्यूटर ओवरहेटिंग होने का खतरा है)। मेरा पहला प्रयास इस तरह काम किया (सरलीकृत):

make &
subpid="$!"

sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"

sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"

wait "$subpid"

दुर्भाग्य से, यह काम नहीं किया; इस प्रक्रिया को SIGSTOP भेजने से इसे विराम नहीं मिला (जैसा कि टर्मिनल में आउटपुट भेजने के लिए इसके जारी रहने से स्पष्ट हुआ)। मैं make &कमांड लाइन पर चला गया , SIGSTOP भेजा, और प्रक्रिया की स्थिति की जाँच की ps; इसे बंद कर दिया गया था (और जब मैंने SIGCONT भेजा तो फिर से शुरू किया गया), लेकिन यह अभी भी उत्पादन को कम कर रहा था और मेरे मूल तापमान को बढ़ा रहा था! Ctrl-Z के साथ इसे रोकना कभी भी यह समस्या नहीं थी, लेकिन मुझे नहीं पता कि स्क्रिप्ट में यह कैसे करना है।

Ctrl-Z किस चीज़ से अलग है kill -STOP, और मैं शेल स्क्रिप्ट में पूर्व का व्यवहार कैसे प्राप्त कर सकता हूं?


और हाँ, makeपुनरावृत्ति से चलाया जा रहा है। वास्तव में, मुझे लगता है कि यह कई स्तरों तक गहरा है।
तैमूर

जवाबों:


12

Ctrl-Z किस चीज़ से अलग है kill -STOP, और मैं शेल स्क्रिप्ट में पूर्व का व्यवहार कैसे प्राप्त कर सकता हूं?

CTRL-Zआमतौर पर SIGTSTP (जिसे ब्लॉक किया जा सकता है) भेजता है, और - अन्य चीजों के अलावा - गोले अक्सर इन मौकों पर पहले से सहेजे गए राज्य को ट्टी रीसेट करते हैं। हालांकि, अधिक महत्वपूर्ण बात यह है कि नियंत्रण टर्मिनल प्रक्रिया समूह शेल के पीआईडी ​​के लिए सेट है (और फिर से फिर से शुरू होने वाले पीआईडी ​​के लिए fg)।

अपनी मूल समस्या पर वापस: जैसे कि Cpufreqd जैसे तापमान पर निर्भर आवृत्ति स्केलिंग का उपयोग करना वास्तव में आपके नाखून के लिए एक बेहतर हथौड़ा हो सकता है।


4

आप makeप्रक्रिया को रोकना नहीं चाहते हैं ; आप इस makeप्रक्रिया को रोकना चाहते हैं और इसकी सभी बाल प्रक्रियाएँ। मुझे यकीन है कि पुनरावर्ती को चलाया जा रहा था।

आप कोशिश कर सकते हैं set -m, तो %1इसके बजाय का उपयोग करें "$subpid"

set -mसक्षम बनाता है "काम पर नियंत्रण", जो कि डिफ़ॉल्ट अंदर स्क्रिप्ट से बंद है। मुझे लगता है कि यह आपके उपयोग के मामले में काम करना चाहिए, हालांकि लोगों को लगता है कि यह सामान्य रूप से एक बुरा विचार है


4

यदि आप एक सत्र नेता के पीजीआईडी ​​- नकारात्मक पीआईडी ​​मान निर्दिष्ट करते हैं, तो आप एक प्रक्रिया समूह में सभी प्रक्रियाओं के लिए एक संकेत भेज सकते हैं।

kill -STOP -"$subpid"

नोट: एक नए सत्र उपयोग में एक कार्यक्रम चलाने के लिए setsid make । लेकिन आपके मामले में मुझे लगता है कि इसकी जरूरत नहीं है। हालाँकि, यदि मेक को पुनरावर्ती रूप से चलाया जाता है, तो मेक का प्रत्येक उदाहरण इसका अपना नेता हो सकता है (मुझे इस बारे में निश्चित नहीं है)।

एक अन्य विकल्प का उपयोग किया जा सकता है killall:

killall -STOP make

Ctrl + Z और मार -STOP के बीच का अंतर:

  • Ctrl-Z वास्तव में TSTP भेजता है, जिसे अवरुद्ध किया जा सकता है।
  • रोक नहीं सकता।

PGID दृष्टिकोण काम नहीं किया, और उत्पादन की निम्नलिखित पंक्ति का उत्पादन किया /usr/local/bin/myscript: line 38: kill: (-10202) - No such process:। पृष्ठभूमि की प्रक्रियाएं चलती रहीं। मुझे नहीं लगता कि killallदृष्टिकोण काम करेगा क्योंकि कुछ उपप्रकारों के shबजाय दिखाई देते हैं make
तैमोन

ऐसा लगता है कि आप जिस प्रक्रिया को संकेत भेज रहे हैं वह पहले ही समाप्त हो चुकी है। श नाम के सबप्रोसेस मेक द्वारा बनाए गए हैं। आपके और कई उपप्रकारों के मामले में सबसे अच्छा शायद सभी बच्चों के पीआईडी ​​प्राप्त करना और उन सभी को रोकना होगा।
जरीज

यह समाप्त हो गया जब मैंने इसे शेल से मैन्युअल रूप से किया, लेकिन शेल स्क्रिप्ट में नहीं। मैं यह सोच रहा हूं क्योंकि जब मैंने इसे मैन्युअल रूप से किया था, तो रूट पीआईडी ​​(जो अन्य ने अपने पीजीआईडी ​​को विरासत में प्राप्त किया था) पहले makeकमांड की थी, लेकिन जब मैंने इसे स्क्रिप्ट से किया, तो रूट पीआईडी ​​शेल स्क्रिप्ट से ही था ।
तैमोन

1

Ctrl+ Cका उपयोग सिग्नल के साथ एक प्रक्रिया को मारने के लिए किया जाता है SIGINT, दूसरे शब्दों में यह एक विनम्र हत्या है

Ctrl+ Z का उपयोग किसी प्रक्रिया को निलंबित करने के लिए किया जाता है , यह संकेत SIGSTP , जो एक नींद संकेत की तरह है, को पूर्ववत किया जा सकता है और प्रक्रिया फिर से शुरू की जा सकती है।

हालाँकि जब कोई प्रक्रिया निलंबित हो जाती है, तो हम इसे फिर से फिर से शुरू कर सकते हैं fg (अग्रभूमि में फिर से शुरू) और bg (पृष्ठभूमि में फिर से शुरू) , लेकिन मैं एक मारे गए प्रक्रिया को फिर से शुरू नहीं कर सकता, यह Ctrl+ C& Ctrl+ का उपयोग करने के बीच एक अंतर है Z

निलंबित प्रक्रिया को कैसे देखें ?

जब आपके पास कई निलंबित कमांड हैं, तो उन्हें सूचीबद्ध करने के लिए, आप jobsकमांड का उपयोग करते हैं , और आउटपुट होगा:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

पृष्ठभूमि में एक निलंबित प्रक्रिया को कैसे मारना है?

killआदेश का उपयोग करके :

kill %nजहां n जॉब नंबर (जॉब्स आउटपुट से स्क्वायर ब्रैकेट में एक) है, इसलिए मैं बिल्ली को मारना चाहता हूं kill %1:।

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