2010-05-31 11 views
14

मैं nohup तरह का उपयोग कर एक स्क्रिप्ट चलाने की कोशिश की,यह पता लगाने के लिए कि कोई स्क्रिप्ट चलाने के बाद कोई स्क्रिप्ट समाप्त हो या नहीं?

nohup script.sh & 

जब मैं करने की कोशिश की

ps -ef | grep "script.sh" 

मैं इसे वहाँ ग्रेप जो एक पैरामीटर के रूप कि तार के साथ चलाया जा रहा है के लिए छोड़कर नहीं पा सके।

क्या मैं इसे सही कर रहा हूं? क्या इसका मतलब यह है कि प्रक्रिया वास्तव में निष्पादन समाप्त हो गई है? धन्यवाद।

उत्तर

13

अपनी खोल स्क्रिप्ट की शुरुआत में, फ़ाइल को पीआईडी ​​लिखें (उदाहरण के लिए,/var/run में)। फिर, आप यह जानने के लिए कि क्या प्रक्रिया पूरी की गई है या नहीं, केवल उस पीआईडी ​​की खोज कर सकते हैं। आप अंतर्निहित $$ चर का उपयोग कर अपनी खोल स्क्रिप्ट का पीआईडी ​​प्राप्त कर सकते हैं।

ps -p `cat /var/run/myscript.pid` 

आप के रूप /var/run में लिखने में सक्षम नहीं हो सकता है: यदि यह अभी भी चल रहा है की जाँच करने के

echo $$ > /var/run/myscript.pid 

फिर,:

पीआईडी, अपनी स्क्रिप्ट के शीर्ष पर डाल रिकॉर्ड करने के लिए एक सामान्य उपयोगकर्ता यदि नहीं, तो /tmp

+0

धन्यवाद। क्या मैं/var/run और/tmp जैसे/home के अलावा कुछ भी उपयोग कर सकता हूं? – learner135

+0

यूप, जो भी आपके लिए सबसे अच्छा काम करता है। –

+9

सावधानी के नोट: पीआईडी ​​को कभी-कभी फिर से उपयोग किया जाता है (अक्सर ओएस पर मजबूत यादृच्छिकता के बिना, या बहुत कम अल्पकालिक प्रक्रियाओं वाले सिस्टम पर)। परावर्तक यह जांचना चाह सकता है कि प्रक्रिया में सही माता-पिता ($$) हैं, या बच्चे स्क्रिप्ट बाहर निकलने पर myscript.pid फ़ाइल को हटा दें (कुछ ''जाल' आरएम/var/run/myscript.pid EXIT '') या दोनों – pra

11

नोहुप कार्यान्वयन के अधीन, लेकिन अधिकांश मामलों में यह काम करेगा।

nohup script.sh & 

पीआईडी ​​को एक चर में स्टोर करने के बाद। $! अंतिम पृष्ठभूमि प्रक्रिया का पीआईडी ​​है।

HISPID=$! 

तो फिर तुम जांच सकें ps या मारने के साथ नहीं है:

ps -p $HISPID 
kill -0 $HISPID 

के विपरीत अन्य समाधान तैनात, इस script.sh संशोधित

+0

धन्यवाद लेकिन $ की तरह दिखता है! मेरे खोल पर्यावरण में समर्थित नहीं है। मैं ksh। – learner135

2

$ की आवश्यकता नहीं है! निश्चित रूप से क्ष और ksh93 का हिस्सा है।

echo $SHELL 

आपको दिखाएगा कि आप कौन सा खोल चल रहे हैं।

&

#!/bin/ksh 
nohup ./myscript.sh argument1 2>&1> mylogfile & 
# do some other task 
cnt=0 
while [ $cnt -le 100 ] 
do 
    # work on another task here 
    cnt=$(($cnt + 1)) 
done 
wait 

इंतजार बयान के उचित उपयोग के उदाहरण किसी भी अभी भी समय से चल रहे बच्चे की प्रक्रिया के लिए रुक जाता है। आम तौर पर आप पृष्ठभूमि में एक प्रक्रिया को न फेंकते हैं, उम्मीद करते हैं कि यह हमेशा के लिए दौड़ें, और फिर इसे पूरी तरह से भूल जाएं।

आप एक पूरी तरह से अलग प्रक्रिया है कि हमेशा के लिए चलाता चाहते हैं, एक डेमॉन पर विचार करें। कुछ लोग शैल में डिमन्स लिखते हैं - सर्वोत्तम अभ्यास नहीं - लेकिन यह किया जाता है। आम तौर पर यूनिक्स डेमॉन सी

में

2ed स्टीवंस के यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग 'के अध्याय 13 में लिखा जाता है सभी डेमॉन के बारे में है।

2

मैं scompt द्वारा सुझाव का पालन किया।कॉम मेरी स्क्रिप्ट को संशोधित करने pid

फिर स्टोर करने के लिए मैंने देखा pid उत्पादन के लिए लिखा है, तो यह स्टोर करने के लिए कोई जरूरत नहीं है:

$ nohup ./sync-all.production.sh > sync-all.production.log & 

[1] 3428 
0

क्या काम किया है

sudo ps -e | grep [script name or fragment of name] 

है उदाहरण के लिए "mf-sync.js" नाम की एक स्क्रिप्ट के लिए

sudo ps -e | grep mf-sync 

स्क्रिप्ट नाम और पिड प्रदर्शित करता है; तो मैं उदाहरण के लिए, उपयोग कर सकते हैं पीआईडी ​​1234

sudo kill 1234 

अगले था मैं स्वचालित रूप से इसे मारने के लिए पर्याप्त समय के बाद यह सामान्य रूप से चलाने के लिए समाप्त हो गया है समय समाप्त जोड़ने की जरूरत है, लेकिन यह एक और सवाल

इस बीच है मैं जब तक मैं एक स्क्रिप्ट में टाइमआउट का परीक्षण करने के लिए समय अपने ग्राहक के लिए सिंक चलाने के लिए इस प्रक्रिया को babysit कर सकते हैं,

+0

का उपयोग कर रहा हूं, यदि आप कभी भी एक बनाने को याद नहीं करते हैं, तो आप अपने सूडो पासवर्ड का पता कैसे लगा सकते हैं? –

-1

कोड:

ps r 

चल रहे सभी रिपोर्ट करने के लिए प्रक्रियाओं।

+0

क्या आप अपना उत्तर अधिक विस्तृत कर सकते हैं आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़ना? – abarisone

संबंधित मुद्दे

 संबंधित मुद्दे