जवाबों:
मैंने शुरू किया
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 %
मुझे यह ध्यान देने की आवश्यकता है कि जब आप टर्मिनल को बंद करते हैं जहां आप उस कमांड में प्रवेश करते हैं, तो उप-कमांड को इसके साथ ही मर जाना चाहिए। इसे पुन: पेश करने की कोशिश ने इस व्यवहार को दिखाया।
अब, यह मानते हुए कि आप वास्तव में ऐसी स्थिति में हैं, जहां ऐसा नहीं हुआ था, पृष्ठभूमि में चल रहे प्रोग्राम को मारने के बारे में जाने का एक तरीका, जो &कमांड के अंत में था, इस प्रकार है:
echo $$अपने वर्तमान पीआईडी (प्रोसेस आईडी) को नोट करने के लिए चलाएं , ताकि आप अपने सत्र को न मारें।ps -ef | grep $SHELLकमांड का उपयोग करके यह पता लगा सकते हैं कि कौन से प्रोग्राम एक शेल चला रहे हैं।echo $$ऊपर परिणाम; यह वह पीआईडी है जिसे आप मारना चाहते हैं।kill -SIGTERM <pid>कमांड को चलाएँ<pid>आप अपने सत्र या अपने कंप्यूटर को भी पुनरारंभ कर सकते हैं, लेकिन उपरोक्त आपको इससे बचने की अनुमति देगा।
&टर्मिनल एक नई प्रक्रिया बना सकते हैं और इसके अंदर चलाने के लिए अपना कोड प्राप्त कर देगा। तो आपका कोड टर्मिनल प्रक्रिया से स्वतंत्र हो जाता है। यहां तक कि अगर आप टर्मिनल को बंद करते हैं तो नई प्रक्रिया जिसमें आपका कोड चल रहा है वह बंद नहीं होगा। तो या तो निकालें &या करें ps -aux, अपनी प्रक्रिया का पता लगाएं और इसे मार दें kill (process id)।
आमतौर पर अग्रभूमि के लिए पृष्ठभूमि एफजी के लिए बीजी । यदि आप fg का उपयोग और प्रतीक करते हैं तो यह चालू चल रहे कार्यक्रम को दिखाएगा। प्रेस Ctrl + C को मारने के लिए।
bg/ fgकाम नहीं करेगा bash। चाइल्ड प्रोसेस ( ) होने के reptyrकारण उपयोग करने में असमर्थ होंगे । bashsleep
topदबाकर प्रक्रिया को मारने के लिए भी उपयोग कर सकते हैंk, फिर पीआईडी में प्रवेश कर रहे हैं, फिर दो बार दर्ज करें दबाएं।