2012-06-26 14 views
7

मुझे हर एक्स सेकंड में एप्लिकेशन चलाने की ज़रूरत है, इसलिए, जहां तक ​​क्रॉन इस तरह से सेकंड के साथ काम नहीं करता है, मैंने अनंत लूप के साथ एक बैश स्क्रिप्ट लिखी जिसमें एक्स सेकंड्स सोते हैं।बैश स्क्रिप्ट में अनंत लूप को कैसे बंद करें?

जब मुझे मैन्युअल रूप से चल रहे स्क्रिप्ट को रोकना है, तो मैं इसे सही तरीके से करना चाहता हूं - एप्लिकेशन को पूर्ण कार्य करने दें और अगली बार लूप दर्ज न करें।

क्या आपके पास कोई विचार है, यह कैसे प्राप्त किया जा सकता है? मैंने तर्क पारित करने के बारे में सोचा, लेकिन मुझे नहीं पता कि स्क्रिप्ट चलाने के लिए तर्क कैसे पारित किया जाए।

उत्तर

22

आप एक संकेत जाल कर सकते थे, कहते हैं कि SIGUSR1:

echo "My pid is: $$" 
finish=0 
trap 'finish=1' SIGUSR1 

while ((finish != 1)) 
do 
    stuff 
    sleep 42 
done 

फिर, जब आप अगले चरण पर पाश से बाहर निकलना चाहते:

kill -SIGUSR1 pid 

कहाँ pid की प्रक्रिया-आईडी है स्क्रिप्ट। अगर नींद के दौरान सिग्नल उठाया जाता है, तो यह जाग जाएगा (नींद सो जाती है जब तक कि कोई सिग्नल न हो)।

+0

धन्यवाद :) यह काम करता है –

2

आप किसी फ़ाइल द्वारा कुछ तर्क पारित कर सकते हैं। प्रत्येक पुनरावृत्ति पर आप इस फ़ाइल को पढ़ सकते हैं और देख सकते हैं कि आपके चल रहे कंडशन बदल गए हैं या नहीं।

1

यदि आपको कुछ क्लीनअप करना है तो निम्न संरचना उपयुक्त हो सकती है। सीडीके के जवाब में दिखाए गए अनुसार हत्या का प्रयोग करें।

#=============================================================== 
# FUNCTION DEFINITIONS 
#=============================================================== 
# . . . 

#=== FUNCTION ================================================ 
#   NAME: cleanup 
# DESCRIPTION: 
#=============================================================== 
cleanup() 
{ 
    # wait for active children, remove empty logfile, ..., exit 
    exit 0 
} # ---------- end of function cleanup ---------- 

#=============================================================== 
# TRAPS 
#=============================================================== 
trap cleanup SIGUSR1 

#=============================================================== 
# MAIN SCRIPT 
#=============================================================== 
echo -e "Script '$0'/PID ${$}" 

while : ; do        # infinite loop 
    # . . . 
    sleep 10 
done 
# . . . 

#=============================================================== 
# STATISTICS/CLEANUP 
#=============================================================== 
cleanup 
0

जाल समाधान पहले तैनात मामले ऐसे हैं जिनमें सिर्फ एक या कुछ आदेशों से अधिक पाशन कर रहे हैं के लिए बड़े छोरों के लिए अच्छा है, लेकिन बोझिल है। अगर आदेश एक गैर शून्य से बाहर निकलें कोड है, जो अगर यह बाधा उत्पन्न होती है क्या होगा है

while whatever; do 
    command || break 
done 

इस पाश से बाहर निकाल देगा: इस मामले में मैं निम्नलिखित समाधान सलाह देते हैं। तो जब तक commandSIGINT संभालता है, तो ctrl-c दबाकर दोनों मौजूदा कमांड को रोक देंगे और लूप से बाहर निकलेंगे।

संपादित करें: अपने प्रश्न को और अधिक बारीकी से पढ़ने के बाद, मैं देखता हूं कि आप मौजूदा कमांड को निष्पादित करना जारी रखना चाहते हैं। उस स्थिति में यह समाधान लागू नहीं होता है।