2009-08-04 23 views
7

शुभ दिन! बैश का उपयोग कर एक स्क्रिप्ट में टाइमर (टाइमस्टैम्प? या जो भी शब्द है) को शामिल करने का कोई तरीका है? उदाहरण के लिए पसंद है; प्रत्येक 60 सेकंड, एक विशिष्ट फ़ंक्शन जांचता है कि इंटरनेट नीचे है, यदि यह है, तो यह इसके बजाय वाईफ़ाई डिवाइस से कनेक्ट होता है और इसके विपरीत। संक्षेप में, कार्यक्रम समय-समय पर इंटरनेट कनेक्शन की जांच करता है।बैश स्क्रिप्टिंग में टाइमर कैसे शामिल करें?

कोई सुझाव/उत्तर बहुत सराहना की जाएगी। =)

उत्तर

18

ब्लंट संस्करण

while sleep 60; do 
    if ! check_internet; then 
    if is_wifi; then 
     set_wired 
    else 
     set_wifi 
    fi 
    fi 
done 

ही नींद का प्रयोग के रूप में पाश हालत आप नींद (अर्थात अगर यह एक अग्रभूमि प्रक्रिया है, Ctrl-C करेंगे) की हत्या करके लूप से बाहर तोड़ने के लिए अनुमति देता है।

अगर हम मिनट या घंटे अंतराल पर बात कर रहे हैं, तो क्रॉन शायद बेहतर काम करेगा, क्योंकि मोंटेक्रिस्टो ने बताया।

+0

मैं देखता हूं .. मैं इसे आजमाउंगा। आप लोगों को धन्यवाद! मैं तब भी बेहतर "मैन क्रॉन" पढ़ता हूं। =) – Suezy

+0

फ़ंक्शन कॉल के अंत में माता-पिता नहीं होना चाहिए। – camh

+0

बिल्कुल सही, केवल घोषणा की जानी चाहिए, मैं इसे बदल दूंगा ... – falstro

5

आप मैन क्रॉन करना चाह सकते हैं।

या यदि आपको केवल बैश के साथ रहना है तो बस लूप के अंदर फ़ंक्शन कॉल डालें और नींद 60 पुनरावृत्ति के अंदर सोएं।

0

एक बैश स्क्रिप्ट बनाएं जो एक बार जांचता है कि इंटरनेट कनेक्शन डाउन हो गया है और प्रत्येक 60 सेकंड में चलने वाले क्रॉन्टाब कार्य में स्क्रिप्ट जोड़ें।

4

कृपया यहाँ एक स्क्रिप्ट है कि आप उपयोग कर सकते हैं, पहले इस तरह से अपनी क्रॉन जॉब के लिए कोई प्रविष्टि जोड़ें:

$ sudo crontab -e * * * * */path/to/अपने/स्विचर

यह एक साधारण विधि है जो सर्वर पर पहुंचने योग्य नहीं होने पर लगातार हर मिनट एक जीवित सर्वर को पिंग करने पर रहता है, यह दूसरे राउटर परिभाषित बोले पर स्विच करेगा।

निश्चित रूप से इस मुद्दे का शोषण करने के लिए बेहतर तरीका है।

$ बिल्ली> स्विचर

#!/bin/sh 

route=`which route` 
ip=`which ip` 

# define your email here 
mail="[email protected]" 

# We define our pingable target like 'yahoo' or whatever, note that the host have to be 
# reachable every time 
target="www.yahoo.com" 

# log file 
file="/var/log/updown.log" 

# your routers here 
router1="192.168.0.1" 
router2="192.168.0.254" 

# default router 
default=$($ip route | awk '/default/ { print $3 }') 

# ping command 
ping -c 2 ${target} 

if [ $? -eq 0 ]; then 
    echo "`date +%Y%m%d-%H:%M:%S`: up" >> ${file} 

else 
    echo "`date +%Y%m%d-%H:%M:%S`: down" >> ${file} 

    if [ ${default}==${router1} ]; then 
     ${route} del default gw ${router1} 
     ${route} add default gw ${router2} 
    elif [ ${default}==${router2} ]; then 
     ${route} del default gw ${router2} 
     ${route} add default gw ${router1} 
    fi 
    # sending a notification by mail or may be by sms 
    echo "Connection problem" |mail -s "Changing Routing table" ${mail} 
fi 
+1

उपरोक्त टाइपो - "सुडो क्रोंटब-..." नहीं होना चाहिए "sudo contab -e ..." –

+0

यह सबसे अच्छा समाधान जैसा दिखता है क्रॉन इस तरह के कार्य के लिए बनाया गया है।कुछ दोहराने योग्य समय देरी पर कुछ (यानी एक स्क्रिप्ट) करें। – Jim

+0

मुझे लगता है कि स्क्रिप्ट स्वचालित रूप से डिफ़ॉल्ट राउटर का पता लगाने के लिए याद आती है, लेकिन मुझे लगता है कि मुझे यह पाया गया है कि –

1

आप निम्नलिखित की तरह कुछ कर सकते हैं, लेकिन यह विश्वसनीय नहीं है:

इस तकनीक के साथ
 
#!/bin/sh 

trap handle_timer USR1 

set_timer() { (sleep 2; kill -USR1 $$)& } 
handle_timer() { 
    printf "%s:%s\n" "timer expired" "$(date)"; 
    set_timer 
} 

set_timer 
while true; do sleep 1; date; done 

एक समस्या यह है कि जाल प्रभावी नहीं होगा जब तक है वर्तमान कार्य खोल पर लौटता है (उदाहरण के लिए, नींद 10 के साथ नींद 1 को प्रतिस्थापित करें)। यदि शेल ज्यादातर समय नियंत्रण में है (उदाहरण के लिए यदि यह सभी आदेशों को कॉल करता है तो जल्दी से समाप्त हो जाएगा), यह काम कर सकता है। पाठ्यक्रम का एक विकल्प पृष्ठभूमि में सबकुछ चलाने के लिए है।

3

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

#!/bin/sh 

someproc() 
{ 
     sleep $1 
     return $2 
} 

run_or_timeout() 
{ 
     timeout=$1 
     shift 

     { 
       trap 'exit 0' 15 
       "[email protected]" 
     } & 
     proc=$! 

     trap "kill $proc" ALRM 
     { 
       trap 'exit 0' 15 
       sleep $timeout 
       kill -ALRM $$ 
     } & 
     alarm=$! 

     wait $proc 
     ret=$? 

     # cleanup 
     kill $alarm 
     trap - ALRM 
     return $ret 
} 

run_or_timeout 0 someproc 1 0 
echo "exit: $? (expected: 142)" 
run_or_timeout 1 someproc 0 0 
echo "exit: $? (expected: 0)" 
run_or_timeout 1 someproc 0 1 
echo "exit: $? (expected: 1)" 
संबंधित मुद्दे