क्या मेरे लिए कोई एप्लिकेशन चलाने के लिए क्रॉन को बताने का कोई तरीका है लेकिन अगर प्रक्रिया पहले से मौजूद है तो इसे नहीं चलाएं?
क्या मेरे लिए कोई एप्लिकेशन चलाने के लिए क्रॉन को बताने का कोई तरीका है लेकिन अगर प्रक्रिया पहले से मौजूद है तो इसे नहीं चलाएं?
जवाबों:
सबसे आसान तरीका है, pgrep का उपयोग करें
Crontab में:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
को रोकने के लिए आगे बढ़ें Could not connect to display
। * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
सीधे प्रोग्राम के बजाय, स्क्रिप्ट चलाएँ। बहुत संभावनाएं हैं। उदाहरण के लिए :
MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
$RESTART
fi
pgrep myprog; if [ $? -ne 0 ]; then ...
बेहतर लिखा जाएगाif ! pgrep myprog; then ...
$?
लाइनों के बीच लॉग संदेश या त्रुटि हैंडलिंग जोड़कर, उदाहरण के लिए, अनजाने में इसका मूल्य बाधित करना आसान है ।
यदि पिछली आवृत्ति समाप्त नहीं हुई है तो यह स्क्रिप्ट फिर से नहीं चलेगी। यदि आप कुछ और नहीं चलाना चाहते हैं यदि कोई अन्य विशिष्ट प्रक्रिया चल रही है, तो 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
आप अपनी स्क्रिप्ट में लॉक फ़ाइल का उपयोग कर सकते हैं, लेकिन कृपया प्रक्रिया प्रबंधन देखें ।
flock
एक उपयोगिता है जिसका उपयोग किया जा सकता है।
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
यह आमतौर पर कार्यक्रम के बजाय स्वयं द्वारा नियंत्रित किया जाता है cron
। इसके लिए दो मानक तकनीकें हैं:
1) grep
यह ps
देखने के लिए कि क्या पहले से ही चल रहे नाम से एक प्रक्रिया है
2) स्टार्टअप पर, पहले एक पीआईडी (प्रोसेस आईडी) फ़ाइल के अस्तित्व की जांच करें, आमतौर पर /var/run/program_name.pid
, और, यदि यह मौजूद है, तो फ़ाइल से बाहर रीड पढ़ें और जांचें कि क्या यह प्रक्रिया अभी भी मौजूद है; यदि ऐसा होता है, तो शुरू करने से इनकार करें। यदि pid फ़ाइल मौजूद नहीं है या फ़ाइल में pid चला गया है, तो एक pid फ़ाइल बनाएं, इसमें अपना प्रोसेस आईडी लिखें, और सामान्य स्टार्टअप पर जारी रखें।
हालांकि यह तकनीकी रूप से बैश पाइप लिखना संभव है, जो इनमें से किसी को भी सीधे आपके क्रॉस्टैब में कर देगा, उन्हें शुरू किए जा रहे प्रोग्राम में जोड़ना बेहतर होगा (ताकि वे कोई बात नहीं लागू करें कि यह कैसे शुरू होता है) या एक आवरण स्क्रिप्ट लिखने के लिए इसे संभाल लें, जैसा कि harrymc ने सुझाया है।
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
मैंने पैटर्न मिलान में सुधार के साथ उपर्युक्त उत्तर का पुन: उपयोग किया है। f विकल्प के बिना pgrep प्रक्रिया प्रक्रिया से मेल नहीं खाता है। फिर भी f विकल्प का उपयोग करने में समस्या है। एफ विकल्प के साथ, क्रोन को खोल देने वाला खोल हमेशा मेल खाता है और अपने पीआईडी को वापस करता है इसलिए प्रक्रिया कभी भी पुनरारंभ नहीं होती है।
अक्षर पैटर्न में से एक के आसपास [] जोड़ना केवल प्रक्रिया से मेल खाता है और क्रोन शेल का पिंड वापस नहीं किया गया है।
डॉक्स: https://www.timkay.com/solo/
सोलो एक बहुत ही सरल स्क्रिप्ट (10 लाइनें) है जो एक प्रोग्राम को एक बार में एक से अधिक कॉपी चलाने से रोकती है। यह सुनिश्चित करने के लिए क्रोन के साथ उपयोगी है कि एक नौकरी खत्म होने से पहले नहीं चलती है।
उदाहरण
* * * * * solo -port=3801 ./job.pl blah blah