पृष्ठभूमि में चल रहे बैश शेल स्क्रिप्ट को समाप्त करना


16

मैं अक्सर 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 &?


@Andrew, क्या दोनों प्रक्रियाएँ nohup कमांड में उल्लिखित हैं? .... वैकल्पिक रूप से आप ps -aWu एंड्रयू की कोशिश कर सकते हैं और जांच सकते हैं कि क्या आपको nohup के साथ एक एकल लंबी प्रविष्टि मिलती है .... क्या यह मदद करता है?
नितिन

2
एक तरफ के रूप में, आपका उद्धरण निराला है। for s in a b c; do foo "$s".txt; done
ट्रिपल जू 15'13

1
@ एसएनएसडी: नहीं, nohupआपके द्वारा शुरू की गई नौकरी को देखने के लिए जब तक आप एक प्रक्रिया लिस्टिंग नहीं लाएंगे तब तक लंबे समय तक चलेगा। आप psआउटपुट में "स्पष्टता" कॉलम देख सकते हैं लेकिन यहां उत्तर अधिक उपयोगी हैं।
ट्रिपल जू

जवाबों:


10

डिफ़ॉल्ट रूप से, psउन मापदंडों को नहीं दिखाएगा जिन्हें प्रोग्राम के साथ बुलाया गया था। विकल्प -fऔर -lदोनों पूर्ण कॉल दिखाएंगे।

ps -fu username

परिणाम है कि उत्पादन की तरह दिखता है:

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

2
यह मामूली उपयोगी है, लेकिन एक ही तर्कों के साथ कई प्रक्रियाओं की अवहेलना नहीं करता है।
ट्रिपल जू

11

आपके पास विकल्पों की एक जोड़ी है। चूंकि आपकी प्रक्रिया पृष्ठभूमि में चल रही है, आप jobsइसे खोजने के लिए उपयोग कर सकते हैं :

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

आप pkillकमांड लाइन मिलान के लिए प्रक्रिया तालिका खोजने के लिए भी उपयोग कर सकते हैं ; अर्थात:

pkill -f script.sh

1

ps(उदाहरण के साथ उत्पादन ps aux) माता पिता की प्रक्रिया ID शामिल हैं। माता-पिता को मार डालो bash, और उसके बच्चों को भी समाप्त कर दिया जाएगा।

प्रक्रिया के पेड़ के एक ASCII दृश्य के लिए, pstree -pकुछ पृष्ठभूमि प्रक्रियाओं को चलाने के साथ प्रयास करें ।

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