एक स्क्रिप्ट को एक विशिष्ट समय पर कैसे रोकना है जब तक कि इसे क्रोन द्वारा फिर से शुरू नहीं किया जाता है?


12

मेरे पास रास्पबेरी पाई है जो OSMC (डेबियन आधारित) चल रहा है।

मैंने आधी रात को स्क्रिप्ट, सिंक.श, शुरू करने के लिए क्रॉन जॉब सेट किया है।

0 0 * * * /usr/local/bin sync.sh

मुझे सुबह 7 बजे स्क्रिप्ट बंद करने की जरूरत है। वर्तमान में मैं उपयोग कर रहा हूं:

0 7 * * * shutdown -r now

क्या कोई बेहतर तरीका है? मुझे लगता है कि रिबूटिंग ओवरकिल है।

धन्यवाद

जवाबों:


25

आप इसे timeoutकमांड से चला सकते हैं ,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

पुनश्च। यदि आपकी सिंक प्रक्रिया में बहुत अधिक समय लगता है, तो आप अपने डेटा को सिंक्रनाइज़ करने के लिए एक अलग दृष्टिकोण पर विचार कर सकते हैं, शायद प्रतिकृति को ब्लॉक कर सकते हैं।


मेरा इंटरनेट कनेक्शन धीमा है इसलिए सिंक करने में इतना समय क्यों लगता है। क्या आप किसी विशेष सिग्नल की सिफारिश करेंगे?
एंथोनी

@ अभी आप कैसे सिंक करते हैं?
राबिन


अधिक विशेष रूप से: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
एंथनी

@ एंथनी आप अन्य एप्लिकेशन जैसे syncthing ( syncthing.net ) या BTSync ( resilio.com ) की कोशिश कर सकते हैं , जो सिंक करने के लिए फ़ाइल के ब्लॉक स्तर पर काम करते हैं
राबिन

9

यदि आपका सिंक आसानी से 17 घंटे के हाइबरनेशन के बाद जारी रख सकता है, तो प्रयास करें

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

यदि आपका सिंक शुरुआत से पुनः आरंभ करना पसंद करता है, तो प्रयास करें

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

यदि आपके सिंक या इसके सबटुक संकेतों को अनदेखा करते हैं, लेकिन कोई मलबे नहीं छोड़ते हैं, तो इसे बनाएं

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc


मैं नीचे दी गई स्क्रिप्ट का उपयोग कर रहा हूं, दर्पण के साथ -c यह दिमाग को फिर से शुरू नहीं करता है। इसके बाद के संस्करण में से कौन सा आप की सिफारिश करेंगे ?: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
एंथोनी

यह देखते हुए कि LFTP स्क्रिप्ट एक SIGTERM को अपने लॉकफाइल को साफ करने और 17 निष्क्रिय घंटों या इससे भी बदतर इनसेट [64] पर बेहतर होने की संभावना को देखते हुए, मैं 0 0 * * * timeout 7h /usr/local/bin/sync.shअपने ज्यादातर समकक्ष killall -TERMसंस्करण के लिए जाना चाहूंगा ।
रोमन Czyborra

4

मैं निश्चित समय पर उस सेवा या स्क्रिप्ट को "रोकने" या "मारने" के लिए भी क्रोन का उपयोग करूंगा।
अपनी नौकरी या स्क्रिप्ट को चलाने के लिए पहले अपना क्रॉन जॉब बनाएं। (आप आसानी से एक और क्रोन चला सकते हैं जो एक नौकरी को मार देगा जिसका एक नाम है sudo pkill wget)

दूसरे, आप आउटपुट में, एक उपयोगी और पठनीय प्रारूप में रनटैब कार्यों को देखना चाहते हैं:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

वे पहली पंक्तियों में दिखाई देंगे, कुछ इस तरह से:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

पहला कॉलम पीआईडी ​​है, दूसरा सेशन आईडी है और तीसरा क्रोन द्वारा शुरू किया गया कमांड है। आप सत्र आईडी का उपयोग करके विशिष्ट क्रोन कार्य से संबंधित सभी प्रक्रियाओं को मार सकते हैं, इसलिए ऊपर दिए गए उदाहरण में आपको सत्र आईडी 4289 को मारना चाहिए:

   pkill -s 4289

आपको एक स्क्रिप्ट में pkill डालनी होगी और इसे एक क्रोन के रूप में चलाना होगा


हर बार क्रॉन जॉब चलने पर क्या सेशन आईडी बदल जाएगी? बंद और चालू करने के बाद क्या होगा?
एंथनी

हाँ यह बदल जाएगा। लेकिन अगर आप इसे स्क्रिप्ट करते हैं, तो आप पीआईडी ​​प्राप्त कर सकते हैं और इसे एक चर में रख सकते हैं। यदि आप दिखाते हैं तो आप केवल नाम का उपयोग करने में सक्षम हो सकते हैं। pkill sync.sh
ddlingo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.