मैं अक्सर bash
कई अलग-अलग फ़ाइलों के लिए सरल कमांड चलाने के लिए शेल स्क्रिप्ट का उपयोग करता हूं । उदाहरण के लिए, मान लीजिए कि मैं निम्नलिखित है bash
खोल स्क्रिप्ट, कहा जाता है script.sh
, कि इस कार्यक्रम / कमांड चलाता foo
तीन पाठ फ़ाइलों पर "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
इसके अलावा, मान लीजिए कि foo $strname".txt"
यह धीमा है, इसलिए स्क्रिप्ट के निष्पादन में लंबा समय लगेगा (उदाहरण के लिए घंटे या दिन)। इस वजह से, मैं उपयोग करना चाहूंगा nohup
ताकि टर्मिनल बंद या डिस्कनेक्ट होने पर भी निष्पादन जारी रहे। मैं यह भी चाहूंगा कि स्क्रिप्ट तुरंत पृष्ठभूमि पर जाए, इसलिए मैं &
ऑपरेटर का उपयोग करूंगा । इस प्रकार मैं कॉल करने के लिए निम्न कमांड का उपयोग करूंगा script.sh
:
nohup bash script.sh &
यह पृष्ठभूमि में और हैंगअप के बिना स्क्रिप्ट को चलाने के लिए ठीक काम करता है, लेकिन अब मान लीजिए कि मैं किसी कारण से किसी भी समय निष्पादन को समाप्त करना चाहूंगा। मैं यह कैसे कर सकता हूँ?
मैंने जो समस्या का सामना किया है, वह यह है कि top
मैं केवल foo
इसी को देखता हूं "a.txt"
। मैं उस foo
कॉल को समाप्त कर सकता हूं , लेकिन फिर कॉल foo
करने के लिए संबंधित है "b.txt"
और फिर मुझे उस एक को भी समाप्त करना होगा, और इसी तरह। for
लूप में निर्दिष्ट दसियों या सैकड़ों टेक्स्ट फाइल्स के लिए , यह हर foo
एक को समाप्त करने के लिए एक दर्द बन जाता है ! इसलिए किसी तरह मुझे इसके बजाय शेल स्क्रिप्ट को समाप्त करने की आवश्यकता है , न कि शेल स्क्रिप्ट से जारी विशेष कॉल।
जब मैं कमांड टाइप करता हूँ
ps -u myusername
myusername
मेरा उपयोगकर्ता नाम कहां है, मुझे उन प्रक्रियाओं की एक सूची मिलती है जो मैं चला रहा हूं। लेकिन मुझे दो अलग-अलग प्रक्रिया आईडी कहते हैं bash
। मुझे कैसे पता चलेगा कि इनमें से कौन सी प्रक्रिया, यदि कोई हो, मेरी मूल कॉल से मेल खाती है nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
आपके द्वारा शुरू की गई नौकरी को देखने के लिए जब तक आप एक प्रक्रिया लिस्टिंग नहीं लाएंगे तब तक लंबे समय तक चलेगा। आप ps
आउटपुट में "स्पष्टता" कॉलम देख सकते हैं लेकिन यहां उत्तर अधिक उपयोगी हैं।