मुझे एक CRON जॉब बनाने की जरूरत है जो हर महीने के आखिरी दिन चलेगी। मैं इसे cPanel का उपयोग करके बनाऊंगा।
किसी भी मदद की सराहना की है। धन्यवाद
मुझे एक CRON जॉब बनाने की जरूरत है जो हर महीने के आखिरी दिन चलेगी। मैं इसे cPanel का उपयोग करके बनाऊंगा।
किसी भी मदद की सराहना की है। धन्यवाद
जवाबों:
संभवतः सबसे आसान तरीका तीन अलग-अलग काम करना है:
55 23 30 4,6,9,11 * myjob.sh
55 23 31 1,3,5,7,8,10,12 * myjob.sh
55 23 28 2 * myjob.sh
यह 28 फरवरी को चलेगा, हालांकि, लीप ईयर पर भी, अगर यह समस्या है, तो आपको एक और रास्ता तलाशना होगा।
हालांकि, यह आमतौर पर प्रत्येक महीने के पहले दिन जितनी जल्दी हो सके नौकरी चलाने के लिए काफी आसान और सही दोनों है , कुछ इस तरह से:
0 0 1 * * myjob.sh
और पिछले महीने के डेटा को संसाधित करने के लिए स्क्रिप्ट को संशोधित करें ।
यह किसी भी परेशानी को हटाता है जो आपको पता लगा सकता है कि महीने का आखिरी दिन कौन सा है, और यह भी सुनिश्चित करता है कि उस महीने के सभी डेटा उपलब्ध हैं, यह मानते हुए कि आप डेटा संसाधित कर रहे हैं। महीने के आखिरी दिन पांच मिनट से आधी रात तक चलने से आपको कुछ भी याद आ सकता है जो तब और आधी रात के बीच होता है।
यह वैसे भी करने का सामान्य तरीका है, सबसे अंत महीने की नौकरियों के लिए।
अगर आप अभी भी वास्तव में महीने के अंतिम दिन पर इसे चलाने के लिए चाहते हैं, एक ही विकल्प बस अगर कल (अपनी स्क्रिप्ट के हिस्से के रूप में या तो, या crontab अपने आप में) पहला है पता लगाने के लिए है।
तो, कुछ इस तरह:
55 23 28-31 * * [[ "$(date --date=tomorrow +\%d)" == "01" ]] && myjob.sh
एक अच्छी शुरुआत होनी चाहिए, यह मानते हुए कि आपके पास अपेक्षाकृत बुद्धिमान date
कार्यक्रम है।
यदि आपका date
कार्यक्रम आपको सापेक्ष तिथियां देने के लिए पर्याप्त रूप से उन्नत नहीं है, तो आप बस महीने के कल (आप को पूर्ण शक्ति की आवश्यकता नहीं है date
) देने के लिए एक बहुत ही सरल कार्यक्रम एक साथ रख सकते हैं , जैसे:
#include <stdio.h>
#include <time.h>
int main (void) {
// Get today, somewhere around midday (no DST issues).
time_t noonish = time (0);
struct tm *localtm = localtime (&noonish);
localtm->tm_hour = 12;
// Add one day (86,400 seconds).
noonish = mktime (localtm) + 86400;
localtm = localtime (&noonish);
// Output just day of month.
printf ("%d\n", localtm->tm_mday);
return 0;
}
और फिर उपयोग करें (यह मानकर कि आपने इसे tomdom
"महीने के कल के लिए बुलाया है "):
55 23 28-31 * * [[ "$(tomdom)" == "1" ]] && myjob.sh
यद्यपि आप दोनों के बाद से त्रुटि जाँच को जोड़ने पर विचार कर सकते हैं time()
और यदि कुछ गलत होता है तो mktime()
वापस आ सकते -1
हैं। सरलता के कारणों के लिए उपरोक्त कोड, इसे ध्यान में नहीं रखता है।
थोड़ी कम विधि है जो ऊपर दिए गए एक के समान उपयोग की जा सकती है। अर्थात्:
[ $(date -d +1day +%d) -eq 1 ] && echo "last day of month"
इसके अलावा, crontab प्रविष्टि केवल 28 वें से 31 वें दिन जांचने के लिए अद्यतन की जा सकती है क्योंकि यह महीने के अन्य दिनों में इसे चलाने में व्यर्थ है। जो आपको देगा:
0 23 28-31 * * [ $(date -d +1day +%d) -eq 1 ] && myscript.sh
/bin/sh: -c: line 1: unexpected EOF while looking for matching ')'
।
[ $(date -d +1day +\%d) -eq 1 ] && run_job
posix
"-d +1day"
[ `date +\%d` -eq `cal | xargs echo | awk '{print $NF}'` ] && myscript.sh
महीने के पहले दिन चलाने के लिए क्रॉन जॉब सेट करें। फिर सिस्टम की घड़ी को एक दिन पहले बदल दें।
विकिपीडिया के बाद इस बारे में क्या?
55 23 L * * /full/path/to/command
पैक्सिडाब्लो के समाधान का पालन करते हुए, मैं 28 और 29 फरवरी को चलता हूं । 29 वें से डेटा 28 वें ओवरराइट करता है।
# min hr date month dow
55 23 31 1,3,5,7,8,10,12 * /path/monthly_copy_data.sh
55 23 30 4,6,9,11 * /path/monthly_copy_data.sh
55 23 28,29 2 * /path/monthly_copy_data.sh
,29
।
55 23 28 2
?
आप महीने के हर दिन चलने के लिए क्रोन जॉब सेट कर सकते हैं, और इसमें निम्नलिखित की तरह एक शेल स्क्रिप्ट भी चल सकती है। यह स्क्रिप्ट काम करती है कि क्या कल का दिन संख्या आज से कम है (यानी यदि कल एक नया महीना है), और फिर आप जो चाहें करें।
TODAY=`date +%d`
TOMORROW=`date +%d -d "1 day"`
# See if tomorrow's day is less than today's
if [ $TOMORROW -lt $TODAY ]; then
echo "This is the last day of the month"
# Do stuff...
fi
कुछ क्रोन कार्यान्वयन महीने के अंतिम दिन का प्रतिनिधित्व करने के लिए "एल" ध्वज का समर्थन करते हैं।
यदि आप उन कार्यान्वयनों में से एक का उपयोग करने के लिए भाग्यशाली हैं, तो यह उतना ही सरल है:
0 55 23 L * ?
जो कि हर महीने के आखिरी दिन 11:55 बजे चलेगा।
http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger
#########################################################
# Memory Aid
# environment HOME=$HOME SHELL=$SHELL LOGNAME=$LOGNAME PATH=$PATH
#########################################################
#
# string meaning
# ------ -------
# @reboot Run once, at startup.
# @yearly Run once a year, "0 0 1 1 *".
# @annually (same as @yearly)
# @monthly Run once a month, "0 0 1 * *".
# @weekly Run once a week, "0 0 * * 0".
# @daily Run once a day, "0 0 * * *".
# @midnight (same as @daily)
# @hourly Run once an hour, "0 * * * *".
#mm hh Mday Mon Dow CMD # minute, hour, month-day month DayofW CMD
#........................................Minute of the hour
#| .................................Hour in the day (0..23)
#| | .........................Day of month, 1..31 (mon,tue,wed)
#| | | .................Month (1.12) Jan, Feb.. Dec
#| | | | ........day of the week 0-6 7==0
#| | | | | |command to be executed
#V V V V V V
* * 28-31 * * [ `date -d +'1 day' +\%d` -eq 1 ] && echo "Tomorrow is the first today now is `date`" >> ~/message
1 0 1 * * rm -f ~/message
* * 28-31 * * [ `date -d +'1 day' +\%d` -eq 1 ] && echo "HOME=$HOME LOGNAME=$LOGNAME SHELL = $SHELL PATH=$PATH"
00 23 * * * [[ $(date +'%d') -eq $(cal | awk '!/^$/{ print $NF }' | tail -1) ]] && job
एक की जाँच करें संबंधित सवाल unix.com मंच पर।
आप केवल एक क्रोन लाइन में सभी उत्तरों को जोड़ सकते हैं और केवल date
कमांड का उपयोग कर सकते हैं ।
बस महीने के दिन के बीच अंतर की जांच करें जो आज है और कल होगा:
0 23 * * * root [ $(expr $(date +\%d -d '1 days') - $(date +\%d) ) -le 0 ] && echo true
यदि ये अंतर 0 से नीचे है तो इसका मतलब है कि हम महीने को बदलते हैं और महीने का आखिरी दिन होता है।
55 23 28-31 * * echo "[ $(date -d +1day +%d) -eq 1 ] && my.sh" | /bin/bash
महीने का अंतिम दिन 28-31 हो सकता है जो इस बात पर निर्भर करता है कि यह किस महीने (फरवरी, मार्च आदि) है। हालाँकि, इन दोनों मामलों में, अगले दिन हमेशा अगले महीने की 1 तारीख होती है। इसलिए हम यह सुनिश्चित कर सकते हैं कि हम नीचे दिए गए कोड का उपयोग करके महीने के अंतिम दिन हमेशा कुछ काम चलाएं:
0 8 28-31 * * [ "$(date +%d -d tomorrow)" = "01" ] && /your/script.sh