क्या crontab में संपादक (crontab -e) का उपयोग किए बिना क्रोन जॉब्स बनाने का तर्क है। यदि हां, तो कोड क्या बैश स्क्रिप्ट से क्रोनजॉब बनाएगा?
क्या crontab में संपादक (crontab -e) का उपयोग किए बिना क्रोन जॉब्स बनाने का तर्क है। यदि हां, तो कोड क्या बैश स्क्रिप्ट से क्रोनजॉब बनाएगा?
जवाबों:
आप क्रॉस्टैब को इस प्रकार जोड़ सकते हैं:
#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron
* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
स्रोत nixCraft ।
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
- ईदो के जवाब को कॉपी करना आसान
;
साथ &&
मामला है, तो के खिलाफ एक सुरक्षित-गार्ड के रूप में crontab -l
विफल रहता है। हां, जैसे:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
crontab -l
अगर कोई क्रॉस्टैब नहीं है, तो असफल हो जाता है, इसलिए &&
स्क्रिप्ट के लिए क्रॉस्टैब में पहली प्रविष्टि को जोड़ना असंभव हो जाता है।
आप इसे ऑन-द-फ्लाई करने में सक्षम हो सकते हैं
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
crontab -l
वर्तमान crontab नौकरियों को सूचीबद्ध करता है, cat
इसे प्रिंट करता है, echo
नए कमांड को प्रिंट करता है और crontab -
सभी मुद्रित सामान को crontab फ़ाइल में जोड़ता है। आप एक नया करके प्रभाव देख सकते हैं crontab -l
।
crontab -l
वर्तमान crontab नौकरियों को सूचीबद्ध करता है, cat
इसे प्रिंट करता है, echo
नए कमांड को प्रिंट करता है और crontab -
सभी मुद्रित सामान को crontab फ़ाइल में जोड़ता है। आप crontab -l
no crontab for <username>
, तो आप देखेंगे , लेकिन यह वैसे भी काम करता है।
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
काम करता है।
इस छोटी को किसी अस्थायी फ़ाइल की आवश्यकता नहीं है, यह कई सम्मिलन के लिए प्रतिरक्षा है, और यह आपको मौजूदा प्रविष्टि का शेड्यूल बदलने देता है।
कहो कि आपके पास ये हैं:
croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"
इसे डुप्लीकेट में जोड़ने के लिए:
( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -
अपने मौजूदा कार्यक्रम जो भी हो, उसे क्रेसटैब से हटाने के लिए:
( crontab -l | grep -v -F "$croncmd" ) | crontab -
टिप्पणियाँ:
आपकी मदद के लिए सभी को धन्यवाद। यहाँ और अन्य जगहों पर जो कुछ भी मुझे मिला, उसे साथ लेकर आगे बढ़ते हुए:
command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
मैं खुद को दोहराए बिना दो चर की आवश्यकता को समाप्त करने का तरीका नहीं पता लगा सका।
command
जाहिर है कि मैं जिस कार्यक्रम को निर्धारित करना चाहता हूं। शेड्यूलिंग डेटा job
लेता है $command
और जोड़ता है। मुझे कोड की लाइन में दोनों चर की आवश्यकता थी जो काम करता है।
<(*command*)
) कमांड के crontab -l
इनपुट में आउटपुट को चालू करने के लिए fgrep
।fgrep
फिर किसी भी मैच को फ़िल्टर करता है $command
( -v
विकल्प), केस-असंवेदनशील ( -i
विकल्प) के ।<(*command*)
) का उपयोग परिणाम को cat
कमांड के इनपुट में वापस लाने के लिए किया जाता है ।cat
आदेश भी प्राप्त करता है echo "$job"
(आत्म व्याख्यात्मक), फिर से, रीडायरेक्ट thingy का उपयोग (के माध्यम से<(*command*)
)।crontab -l
और सरलecho "$job"
, संयुक्त, पाइप किए जाते हैं ('|') crontab -
को आखिरकार लिखा जाना चाहिए।कोड की यह पंक्ति किसी भी क्रॉन जॉब्स को फ़िल्टर करती है जो कमांड से मेल खाती है, फिर शेष क्रॉन जॉब्स को नए के साथ लिखते हैं, प्रभावी रूप से "ऐड" या "अपडेट" फ़ंक्शन की तरह कार्य करते हैं। इसका उपयोग करने के लिए, आपको केवल command
और job
चर के मूल्यों को स्वैप करना होगा ।
fgrep -v
crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
EDIT (ओवर राइटिंग):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
crontab -l
विफल रहता है, लेकिन crontab -
सफल होता है, तो आपका क्रैस्टब एक-लाइनर होगा।
Crontab के उपयोग के आस-पास बहुत सारे अच्छे उत्तर हैं, लेकिन एक सरल विधि का कोई उल्लेख नहीं है, जैसे कि उपयोग करना cron
।
उपयोग करने cron
से सिस्टम फ़ाइलों और निर्देशिकाओं का लाभ उठाया जाएगा /etc/crontab
, /etc/cron.daily,weekly,hourly
या /etc/cron.d/
:
cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root HOME=/
01 * * * * <user> <command>
EOF
इस उपर्युक्त उदाहरण में, हमने एक फ़ाइल बनाई /etc/cron.d/
, जिसमें कमांड के लिए पर्यावरण वेरिएबल्स को सफलतापूर्वक निष्पादित करने के user
लिए, और कमांड के लिए और command
खुद को प्रदान किया। यह फ़ाइल निष्पादन योग्य नहीं होनी चाहिए और नाम में केवल अल्फा-न्यूमेरिक और हाइफ़न (नीचे अधिक विवरण) होना चाहिए।
हालांकि पूरी तरह से जवाब देने के लिए, आइए crontab
बनाम के बीच के अंतर को देखें cron/crond
:
crontab -- maintain tables for driving cron for individual users
जो लोग सिस्टम पर अपने उपयोगकर्ता के संदर्भ में नौकरी चलाना चाहते हैं, उनके crontab
लिए यह सही अर्थ है।
cron -- daemon to execute scheduled commands
उन लोगों के लिए जो कॉन्फ़िगरेशन प्रबंधन का उपयोग करते हैं या अन्य उपयोगकर्ताओं के लिए नौकरियों का प्रबंधन करना चाहते हैं, जिस स्थिति में हमें उपयोग करना चाहिए cron
।
मैनपेज़ का एक त्वरित अंश आपको कुछ उदाहरण देता है कि क्या करना है और क्या नहीं करना है:
/ etc / crontab और /etc/cron.d में फ़ाइलें रूट के स्वामित्व में होनी चाहिए, और समूह- या अन्य-लेखन योग्य नहीं होनी चाहिए। स्पूल क्षेत्र के विपरीत, /etc/cron.d के तहत या /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly और /etc-cron.monthly के तहत फाइलें भी हो सकती हैं। सिमिलिंक, बशर्ते कि सिम्लिंक और फाइल दोनों इसे रूट के स्वामित्व में हैं। /Etc/cron.d के अंतर्गत फ़ाइलों को निष्पादन योग्य होने की आवश्यकता नहीं है, जबकि /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly और /etc-cron.monthly के रूप में फ़ाइलें वे रन-पार्ट्स द्वारा चलाए जाते हैं (अधिक जानकारी के लिए रन-पार्ट्स (8) देखें)।
स्रोत: http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html
इस तरीके से क्रोन का प्रबंधन करना सिस्टम के दृष्टिकोण से आसान और अधिक मापनीय है, लेकिन हमेशा सबसे अच्छा समाधान नहीं होगा।
<job>
इसमें फ़ाइल एक्सटेंशन शामिल नहीं होना चाहिए।
संभावना है कि आप इसे स्वचालित कर रहे हैं, और आप एक भी नौकरी दो बार नहीं चाहते हैं। उस मामले में उपयोग करें:
__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")
यह केवल तभी काम करता है जब आप BASH का उपयोग कर रहे हों। मुझे सही DASH ( sh
) सिंटैक्स की जानकारी नहीं है।
अद्यतन: यह काम नहीं करता है यदि उपयोगकर्ता के पास अभी तक एक कॉन्ट्राब नहीं है। एक और अधिक विश्वसनीय तरीका होगा:
(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab -
वैकल्पिक रूप से, यदि आपका डिस्ट्रो इसका समर्थन करता है, तो आप एक अलग फाइल का भी उपयोग कर सकते हैं:
echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup
उन लोगों को एक और SO प्रश्न मिला ।
sh: 1: Syntax error: "(" unexpected
का उपयोग कर रहा है ।
<
और के बीच कोई स्थान है (
। इसका मतलब है कि < (
विफल रहता है, लेकिन <(
काम करता है, जब तक कि वहाँ अपने कार्यक्रम में तारक ... हैं
cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
एक वैरिएंट जो केवल क्रीटैब को संपादित करता है यदि वांछित स्ट्रिंग वहां नहीं मिलती है:
CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
यदि आप विक्सी क्रोन का उपयोग कर रहे हैं, उदाहरण के लिए, अधिकांश लिनक्स वितरणों पर, तो आप व्यक्तिगत क्रोनजॉब के साथ /etc/cron.d में फ़ाइल डाल सकते हैं।
यह केवल रूट के लिए काम करता है। यदि आपका सिस्टम इसका समर्थन करता है तो आपको वहां कई उदाहरण देखने चाहिए। (नोट लाइन में शामिल उपयोगकर्ता नाम, पुराने / आदि / crontab के समान सिंटैक्स में)
यह क्रोन में एक दुख की बात है कि एक नियमित उपयोगकर्ता के रूप में इसे संभालने का कोई तरीका नहीं है, और इतने सारे क्रोन कार्यान्वयन के पास इसे संभालने का कोई तरीका नहीं है।
तो, डेबियन, उबंटू में, और इसी तरह के कई डेबियन आधारित डिस्ट्रो ...
एक क्रोन टास्क कंसीनेशन मैकेनिज्म है जो एक कॉन्फिग फाइल लेता है, उन्हें बंडल करता है और उन्हें आपके क्रोन सर्विस में जोड़ता है।
आप /etc/cron.d/somefilename के अंतर्गत कोई फ़ाइल रख सकते हैं जहाँ somefilename जो आप चाहते हैं।
sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync
आइए इसे अलग करें:
sudo - क्योंकि आपको / etc डायरेक्टरी के तहत cron configs को बदलने के लिए एलिवेटेड विशेषाधिकार की आवश्यकता होती है
इको - एसटीडी पर आउटपुट बनाने के लिए एक वाहन। प्रिंटफ, कैट ... साथ ही काम करेगा
"- अपने स्ट्रिंग की शुरुआत में एक डबलक्वेस्ट का उपयोग करें, आप एक पेशेवर हैं
0,15,30,45 * * * * - मानक क्रोन रन शेड्यूल, यह हर 15 मिनट में चलता है
ntpdate -u time.nist.gov - वास्तविक कमांड जिसे मैं चलाना चाहता हूं
"- क्योंकि मेरी पहली डबल कोट्स को आउटपुट होने वाली लाइन को बंद करने के लिए एक दोस्त की आवश्यकता होती है
>> - ओवरराइट के बजाय डबल रीडायरेक्ट जुड़ता है *
/etc/cron.d/vmclocksync - vmclocksync मैंने जो फ़ाइल नाम चुना है, वह /etc/cron.d/ में जाता है
* यदि हम> रीडायरेक्ट का उपयोग करते हैं, तो हम गारंटी दे सकते हैं कि हमारे पास केवल एक कार्य प्रविष्टि थी। लेकिन, हमें मौजूदा फ़ाइल में किसी भी अन्य नियमों को उड़ाने का जोखिम होगा। आप अपने लिए तय कर सकते हैं कि> के साथ संभावित विनाश सही है या संभव डुप्लिकेट के साथ >> आपके लिए हैं। वैकल्पिक रूप से, यदि आप फ़ाइल नाम मौजूद है, अगर उसमें कुछ भी है, और क्या आप किसी तरह का डुप्लिकेट जोड़ रहे हैं, यह जांचने के लिए आप कुछ जटिल या जुड़े हुए हो सकते हैं - लेकिन, मेरे पास करने के लिए सामान है और मैं ऐसा नहीं कर सकता तुम अभी।
इंटरैक्टिव एडिटर के बिना क्रॉन जॉब जोड़ने के लिए बैश स्क्रिप्ट। नीचे दिए गए कोड में लिनक्स फाइलों का उपयोग करके क्रोनजोब को जोड़ने में मदद मिलती है।
#!/bin/bash
cron_path=/var/spool/cron/crontabs/root
#cron job to run every 10 min.
echo "*/10 * * * * command to be executed" >> $cron_path
#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed" >> $cron_path
यहाँ crontab
दोहराव के बिना एक कमांड जोड़ने के लिए एक बैश फ़ंक्शन है
function addtocrontab () {
local frequency=$1
local command=$2
local job="$frequency $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
}
addtocrontab "0 0 1 * *" "echo hello"
CRON="1 2 3 4 5 /root/bin/backup.sh"
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
Add -w पैरामीटर को grep की सटीक कमांड, बिना -w पैरामीटर के क्रोनजॉब "परीक्षण" को जोड़ने के कारण क्रॉन जॉब का विलोपन "test123"
cronjobs को जोड़ने / हटाने के लिए स्क्रिप्ट फ़ंक्शन। कोई दोहराव प्रविष्टियाँ:
cronjob_editor () {
# usage: cronjob_editor '<interval>' '<command>' <add|remove>
if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi
if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi
if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi
if [[ "$3" == add ]] ;then
# add cronjob, no duplication:
( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab -
elif [[ "$3" == remove ]] ;then
# remove cronjob:
( crontab -l | grep -v -F -w "$2" ) | crontab -
fi
}
cronjob_editor "$1" "$2" "$3"
परीक्षण किया गया:
$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
$ crontab -l
$ */10 * * * * echo "this is a test" > export_file
मेरा पसंदीदा समाधान यह होगा:
(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -
यह सुनिश्चित करेगा कि आप रिक्त नई पंक्ति को नीचे सही तरीके से संभाल रहे हैं। Crontab के साथ समस्याओं से बचने के लिए आपको आमतौर पर crontab फ़ाइल को रिक्त नई पंक्ति के साथ समाप्त करना चाहिए। और ऊपर की स्क्रिप्ट यह सुनिश्चित करती है कि यह पहले "grep" के साथ किसी भी रिक्त रेखा को हटा दे। भाग, और फिर स्क्रिप्ट के अंत में "\ n" के साथ अंत में एक नई रिक्त पंक्ति में जोड़ें। यह आपकी नई कमांड के ऊपर एक रिक्त रेखा प्राप्त करने से भी रोकेगा यदि आपकी मौजूदा crontab फ़ाइल रिक्त रेखा के साथ समाप्त होती है।
echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune
नहीं, क्रोनब फ़ाइलों को संशोधित करने के लिए क्रॉस्टैब में कोई विकल्प नहीं है।
आपको इसके लिए: वर्तमान क्रोन फ़ाइल (crontab -l> newfile) लेनी है, इसे बदलें और नई फ़ाइल को जगह दें (crontab newfile)।
यदि आप perl से परिचित हैं, तो आप इस मॉड्यूल का उपयोग कर सकते हैं विन्यास :: Crontab ।
एलएलपी, एंड्रिया
cronjobs जोड़ने के लिए स्क्रिप्ट समारोह। डुप्लिकेट प्रविष्टियों की जाँच करें, उपयोगी अभिव्यक्ति *> "
cronjob_creator () {
# usage: cronjob_creator '<interval>' '<command>'
if [[ -z $1 ]] ;then
printf " no interval specified\n"
elif [[ -z $2 ]] ;then
printf " no command specified\n"
else
CRONIN="/tmp/cti_tmp"
crontab -l | grep -vw "$1 $2" > "$CRONIN"
echo "$1 $2" >> $CRONIN
crontab "$CRONIN"
rm $CRONIN
fi
}
परीक्षण किया गया:
$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
$ crontab -l
$ */10 * * * * echo "this is a test" > export_file
स्रोत: मेरा दिमाग;)
आप शायद एडिट करने के लिए डिफ़ॉल्ट एडिटर को बदल सकते हैं और एडिट करने के लिए एक हेरेडोक का उपयोग कर सकते हैं।
EDITOR=ed
export EDITOR
crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF
प्रमुख नोट > कि उस कोड में का मतलब है कि नई लाइन बनाने के लिए रिटर्न / एंटर की को दबाया गया है।
एक साधन तो संलग्न यह अधिलेखित कुछ भी नहीं होगा।
द ।आप संपादन कर रहे हैं इसका मतलब है।
द व साधन परिवर्तन लिखें।
क्ष साधन QUIT या बाहर निकलने के एड।
आप इसे देख सकते हैं
crontab -l
आप एक प्रविष्टि भी हटा सकते हैं।
EDITOR=ed
export EDITOR
crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF
वह इसमें माईस्क्रिप्ट के साथ क्रॉस्टैब एंट्री को हटा देगा।
घ साधन अंदर पैटर्न हटाना / / ।
इसकी दोबारा जांच नहीं
crontab -l
यह समाधान स्क्रिप्ट के अंदर बहुत कम काम करता है > बेशक :-)