cron: एक प्रक्रिया चलाते हैं, लेकिन केवल अगर यह चल रहा है?


11

क्या मेरे लिए कोई एप्लिकेशन चलाने के लिए क्रॉन को बताने का कोई तरीका है लेकिन अगर प्रक्रिया पहले से मौजूद है तो इसे नहीं चलाएं?

linux  cron 

क्या आप स्पष्ट करेंगे कि ऐप पहले से चल रहा है या नहीं, या यदि कोई अलग प्रक्रिया पहले से चल रही है तो उसे नहीं चलाना चाहिए। धन्यवाद
Linker3000

जवाबों:


23

सबसे आसान तरीका है, pgrep का उपयोग करें

Crontab में:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1

इस उत्तर की सादगी से प्यार करें। FYI करें, आपको pgrep में -f ध्वज जोड़ने में सक्षम होना चाहिए, और फिर आप पूरी प्रक्रिया नाम की जांच कर सकते हैं, जो उपयोगी है यदि आप अपनी स्थिति के भाग के रूप में प्रक्रिया के तर्कों का निरीक्षण करना चाहते हैं।
क्रेग सेफ्टन

6
नहीं, आप cronjob के अंदर pgrep के साथ -f ध्वज का उपयोग नहीं कर सकते। इसका कारण यह है कि आप क्रोनजोब को चलाने के लिए उपयोग किए जाने वाले शेल स्क्रिप्ट के खिलाफ मैच करेंगे।
CpnCrunch

क्रोन के साथ एक जीयूआई प्रक्रिया चलाते समय, त्रुटियों export DISPLAY=:0को रोकने के लिए आगे बढ़ें Could not connect to display* * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
बेंजम

9

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

MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
   $RESTART
fi

1
FYI करें - तर्क सूचियों को संग्रहीत करने के लिए स्केलर चर का उपयोग करना बुरा व्यवहार माना जाता है। ऐसे मामले के उदाहरण के लिए mywiki.wooledge.org/BashFAQ/050 देखें जहां यह विफल हो जाता है।
चार्ल्स डफी 15

... इसी तरह, pgrep myprog; if [ $? -ne 0 ]; then ...बेहतर लिखा जाएगाif ! pgrep myprog; then ...
चार्ल्स डफी

... यह बाद वाली शैली न केवल अधिक पठनीय है, बल्कि कम त्रुटि-प्रवण भी है: $?लाइनों के बीच लॉग संदेश या त्रुटि हैंडलिंग जोड़कर, उदाहरण के लिए, अनजाने में इसका मूल्य बाधित करना आसान है ।
चार्ल्स डफी

7

यदि पिछली आवृत्ति समाप्त नहीं हुई है तो यह स्क्रिप्ट फिर से नहीं चलेगी। यदि आप कुछ और नहीं चलाना चाहते हैं यदि कोई अन्य विशिष्ट प्रक्रिया चल रही है, तो harrymc की स्क्रिप्ट देखें।

DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;

if flock -n -x 8; then
  echo ""
  echo "Starting your script..."
  echo ""

[PUT YOUR STUFF HERE]

  echo ""
  echo "Script started  $DATE";
  echo "Script finished `date +%c`";
else
  echo "Script NOT started - previous one still running at $DATE";
fi

3

आप अपनी स्क्रिप्ट में लॉक फ़ाइल का उपयोग कर सकते हैं, लेकिन कृपया प्रक्रिया प्रबंधन देखें ।

flock एक उपयोगिता है जिसका उपयोग किया जा सकता है।


अच्छा था! अब इस धीमी लाइन पर rsync हर समय लगने वाली जरूरत को पूरा कर सकता है, मैनुअल हस्तक्षेप के बिना लाइन पर आने वाले क्लाइंट होस्ट के 5 मिनट के भीतर फायरिंग:*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584

1

यह आमतौर पर कार्यक्रम के बजाय स्वयं द्वारा नियंत्रित किया जाता है cron। इसके लिए दो मानक तकनीकें हैं:

1) grepयह psदेखने के लिए कि क्या पहले से ही चल रहे नाम से एक प्रक्रिया है

2) स्टार्टअप पर, पहले एक पीआईडी ​​(प्रोसेस आईडी) फ़ाइल के अस्तित्व की जांच करें, आमतौर पर /var/run/program_name.pid, और, यदि यह मौजूद है, तो फ़ाइल से बाहर रीड पढ़ें और जांचें कि क्या यह प्रक्रिया अभी भी मौजूद है; यदि ऐसा होता है, तो शुरू करने से इनकार करें। यदि pid फ़ाइल मौजूद नहीं है या फ़ाइल में pid चला गया है, तो एक pid फ़ाइल बनाएं, इसमें अपना प्रोसेस आईडी लिखें, और सामान्य स्टार्टअप पर जारी रखें।

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


0

* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1

मैंने पैटर्न मिलान में सुधार के साथ उपर्युक्त उत्तर का पुन: उपयोग किया है। f विकल्प के बिना pgrep प्रक्रिया प्रक्रिया से मेल नहीं खाता है। फिर भी f विकल्प का उपयोग करने में समस्या है। एफ विकल्प के साथ, क्रोन को खोल देने वाला खोल हमेशा मेल खाता है और अपने पीआईडी ​​को वापस करता है इसलिए प्रक्रिया कभी भी पुनरारंभ नहीं होती है।

अक्षर पैटर्न में से एक के आसपास [] जोड़ना केवल प्रक्रिया से मेल खाता है और क्रोन शेल का पिंड वापस नहीं किया गया है।


0

डॉक्स: https://www.timkay.com/solo/

सोलो एक बहुत ही सरल स्क्रिप्ट (10 लाइनें) है जो एक प्रोग्राम को एक बार में एक से अधिक कॉपी चलाने से रोकती है। यह सुनिश्चित करने के लिए क्रोन के साथ उपयोगी है कि एक नौकरी खत्म होने से पहले नहीं चलती है।

उदाहरण

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