बैकग्राउंड में लूप चलाते समय बैश को कैसे रोकें?


23

मैंने कुछ समय बाद लूप शुरू किया:

while true; do {command}; sleep 180; done &

ध्यान दें &

मैंने सोचा कि जब मैंने टर्मिनल को मार दिया, तो यह लूप बंद हो जाएगा। लेकिन यह अभी भी चल रहा है। टर्मिनल सत्र को मारे मुझे घंटों हो चुके हैं।

लूप करते समय मैं इसे कैसे रोकूं?

जवाबों:


38

मैंने शुरू किया

while true; do yad; sleep 60; done &

और इसका परीक्षण करने के लिए टर्मिनल को बंद कर दिया, अब मुझे भी यही समस्या है।

यदि आपने पहले ही टर्मिनल बंद कर दिया है तो आपने लूप को शुरू कर दिया है

आइए ps fjx, मेरी मशीन पर अंतिम पंक्तियों के साथ चलने वाली प्रक्रियाओं का अवलोकन करें

 2226 11606 11606 19337 ?           -1 S     1000   0:00  \_ /bin/bash
11606 22485 11606 19337 ?           -1 S     1000   0:00  |   \_ sleep 10
 2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
 9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad
    1  2215  2215  2215 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
 2215  2216  2215  2215 ?           -1 S     1000   0:00  \_ (sd-pam)

यदि आप इसे के आउटपुट में परिवर्तन को बंद करते हैं , तो आप yadएक उपप्रकार के रूप में देख सकते हैं । यदि पेड़ का दृश्य बहुत अधिक भ्रामक है, तो आप आउटपुट को 1 के रूप में भी खोज सकते हैं :/bin/bashyadsleep 60ps

ps fjx | grep "[y]ad"  # or respectively
ps fjx | grep "[s]leep 60"

आउटपुट लाइनें दो नंबरों से शुरू होती हैं, पहला PPID, पैरेंट प्रोसेस की प्रोसेस आईडी और दूसरा PID होने के नाते, प्रोसेस की आईडी। इसकी वजह यह है कि 9411दोनों पंक्तियों में यहाँ दिखाई देता है:

2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad

यही वह bashउपखंड है जिसे हम मारना चाहते हैं और हमें इसका पीआईडी ​​मिल गया है, इसलिए अब जो कुछ भी बचता है वह एक सरल है

kill 9411  # replace 9411 with the PID you found out!

और कष्टप्रद उपधारा अच्छा के लिए चला गया है।

1 : grep "[y]ad"केवल प्रक्रिया के बजाय परिणाम सूची में दिखाई देने से grep yadरोकता है grep


यदि आपके पास टर्मिनल अभी भी खुला है

bashचर प्रदान करता है $!, जो "सबसे हाल ही में पृष्ठभूमि में रखी गई नौकरी की प्रक्रिया आईडी के लिए फैलता है", इसलिए निम्नलिखित सिर्फ पृष्ठभूमि में नवीनतम प्रक्रिया को मारता है:

kill $!

यदि यह नवीनतम प्रक्रिया नहीं है, तो बस jobsबिल्टइन के साथ काम करने की सूची प्राप्त कर सकते हैं , उदाहरण आउटपुट:

[1]-  Running                 while true; do
    yad; sleep 60;
done &
[2]+  Stopped                 sleep 10

नौकरी की सूची में दो काम हैं, उनमें से एक को मारने के लिए आप इसे नौकरी नंबर या शॉर्टकट %, %+("वर्तमान नौकरी") और %-("पिछली नौकरी") के साथ उपयोग कर सकते हैं , जैसे कि पृष्ठभूमि में चल रहे लूप को मारने के लिए कर सकता है

kill %1  # or
kill %-

और निलंबित sleep 10नौकरी को मारने के लिए :

kill %2  # or
kill %+  # or
kill %

5

मुझे यह ध्यान देने की आवश्यकता है कि जब आप टर्मिनल को बंद करते हैं जहां आप उस कमांड में प्रवेश करते हैं, तो उप-कमांड को इसके साथ ही मर जाना चाहिए। इसे पुन: पेश करने की कोशिश ने इस व्यवहार को दिखाया।

अब, यह मानते हुए कि आप वास्तव में ऐसी स्थिति में हैं, जहां ऐसा नहीं हुआ था, पृष्ठभूमि में चल रहे प्रोग्राम को मारने के बारे में जाने का एक तरीका, जो &कमांड के अंत में था, इस प्रकार है:

  1. एक नया शेल खोलें और echo $$अपने वर्तमान पीआईडी ​​(प्रोसेस आईडी) को नोट करने के लिए चलाएं , ताकि आप अपने सत्र को न मारें।
  2. उस प्रोग्राम की पीआईडी ​​को पहचानें जो आपको लगता है कि अभी भी चल रहा है; आप ps -ef | grep $SHELLकमांड का उपयोग करके यह पता लगा सकते हैं कि कौन से प्रोग्राम एक शेल चला रहे हैं।
  3. नोट बाएं से 2 स्तंभ और संख्यात्मक मान ध्यान दें कि अलग अपने से echo $$ऊपर परिणाम; यह वह पीआईडी ​​है जिसे आप मारना चाहते हैं।
  4. चरण # 3 में पहचाने गए संख्यात्मक मान को kill -SIGTERM <pid>कमांड को चलाएँ<pid>
  5. चरण # 2 को दोहराकर कार्यक्रम की पुष्टि करना अब नहीं चल रहा है

आप अपने सत्र या अपने कंप्यूटर को भी पुनरारंभ कर सकते हैं, लेकिन उपरोक्त आपको इससे बचने की अनुमति देगा।


2
आप topदबाकर प्रक्रिया को मारने के लिए भी उपयोग कर सकते हैं k, फिर पीआईडी ​​में प्रवेश कर रहे हैं, फिर दो बार दर्ज करें दबाएं।
luk3yx

-1

&टर्मिनल एक नई प्रक्रिया बना सकते हैं और इसके अंदर चलाने के लिए अपना कोड प्राप्त कर देगा। तो आपका कोड टर्मिनल प्रक्रिया से स्वतंत्र हो जाता है। यहां तक ​​कि अगर आप टर्मिनल को बंद करते हैं तो नई प्रक्रिया जिसमें आपका कोड चल रहा है वह बंद नहीं होगा। तो या तो निकालें &या करें ps -aux, अपनी प्रक्रिया का पता लगाएं और इसे मार दें kill (process id)


-3

आमतौर पर अग्रभूमि के लिए पृष्ठभूमि एफजी के लिए बीजी । यदि आप fg का उपयोग और प्रतीक करते हैं तो यह चालू चल रहे कार्यक्रम को दिखाएगा। प्रेस Ctrl + C को मारने के लिए।


3
टर्मिनल से अलग होने के बाद उपयोग bg/ fgकाम नहीं करेगा bash। चाइल्ड प्रोसेस ( ) होने के reptyrकारण उपयोग करने में असमर्थ होंगे । bashsleep
xiota

उसने टर्मिनल बंद कर दिया क्योंकि वह उस प्रक्रिया को मार देगा। इसलिए अगली बार वह कार्यक्रम को बंद करने के लिए fg का उपयोग करेगा। सरल
जिज्ञासु

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