मैं अक्सर 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आउटपुट में "स्पष्टता" कॉलम देख सकते हैं लेकिन यहां उत्तर अधिक उपयोगी हैं।