আমার একটি সিআরএন জব তৈরি করা দরকার যা প্রতি মাসের শেষ দিনে চলবে। আমি এটি সিপ্যানেল ব্যবহার করে তৈরি করব।
কোন সাহায্য প্রশংসা করা হয়। ধন্যবাদ
আমার একটি সিআরএন জব তৈরি করা দরকার যা প্রতি মাসের শেষ দিনে চলবে। আমি এটি সিপ্যানেল ব্যবহার করে তৈরি করব।
কোন সাহায্য প্রশংসা করা হয়। ধন্যবাদ
উত্তর:
সম্ভবত সহজতম উপায় হ'ল তিনটি পৃথক কাজ করা:
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
এটি ২৮ শে ফেব্রুয়ারি চলবে যদিও লিপ বছরেও, যদি এটি সমস্যা হয় তবে আপনাকে অন্য কোনও উপায় খুঁজে বের করতে হবে।
তবে, প্রতি মাসের প্রথম দিনে যত তাড়াতাড়ি সম্ভব কাজ চালানো যথেষ্ট সহজ এবং সঠিক উভয়ই এমন কিছু সহ:
0 0 1 * * myjob.sh
এবং পূর্ববর্তী মাসের ডেটা প্রক্রিয়া করতে স্ক্রিপ্টটি পরিবর্তন করুন ।
মাসের শেষ দিনটি কোন দিনটি নির্ধারণের সাথে আপনার মুখোমুখি হতে পারে এমন কোনও ঝামেলা সরিয়ে দেয় এবং আপনি ডেটা প্রক্রিয়াজাতকরণের ডেটা ধরে নিয়ে এই মাসের সমস্ত ডেটা উপলব্ধ রয়েছে তাও নিশ্চিত করে। মাসের শেষ দিন পাঁচ মিনিট থেকে মধ্যরাত পর্যন্ত চলতে পারে আপনাকে তখন এবং মধ্যরাতের মধ্যে যা কিছু ঘটতে পারে তা দেখতে পাবে।
বেশিরভাগ মাসের শেষের কাজের জন্য এটি কোনওভাবেই এটি করার সাধারণ উপায়।
আপনি যদি এখনও সত্যিই এটি মাসের শেষ দিনে চালাতে চান তবে একটি বিকল্পটি হ'ল কালকে প্রথম হয় কিনা তা সনাক্ত করা উচিত (হয় আপনার স্ক্রিপ্টের অংশ হিসাবে, বা ক্রোনট্যাব নিজেই)।
সুতরাং, এর মতো কিছু:
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"
এছাড়াও, মাসের অন্যান্য দিনগুলিতে এটি অর্থহীনভাবে চালিত হওয়ায় ক্রোনটিব এন্ট্রিটি কেবলমাত্র 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"
: - more আরও জটিল (এবং [ `date +\%d` -eq `cal | xargs echo | awk '{print $NF}'` ] && myscript.sh
মাসের প্রথম দিনটিতে চালনার জন্য ক্রোন জব সেট আপ করুন। তারপরে সিস্টেমের ঘড়িটি একদিন আগে পরিবর্তন করুন।
উইকিপিডিয়া পরে এই সম্পর্কে কি?
55 23 L * * /full/path/to/command
প্যাক্সিডিয়াবলোর সমাধানটি গ্রহণ করে, আমি ২৮ শে এবং ২৯ শে ফেব্রুয়ারি চালাচ্ছি । 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/docamentation/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"
এডাব্লুএস ক্লাউডওয়াচ ক্রোন বাস্তবায়নের জন্য (লাম্বডাস শিডিউলিং ইত্যাদি) এটি কাজ করে:
55 23 L * ? *
প্রতি মাসের শেষ দিন রাত 11:55 এ চলছে।
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
এই সম্পর্কে কি?
ব্যবহারকারীর .bashprofile
সংযোজন সম্পাদনা করুন :
export LAST_DAY_OF_MONTH=$(cal | awk '!/^$/{ print $NF }' | tail -1)
তারপরে ক্রন্টব এ এই এন্ট্রি যুক্ত করুন:
mm hh * * 1-7 [[ $(date +'%d') -eq $LAST_DAY_OF_MONTH ]] && /absolutepath/myscript.sh
মাসের শেষ দিনটি কোন মাসের (ফেব্রুয়ারি, মার্চ ইত্যাদি) এর উপর নির্ভর করে 28-31 হতে পারে। তবে এর মধ্যে যে কোনও একটিতে পরের দিনটি সর্বদা পরের মাসের 1 ম। সুতরাং আমরা নীচের কোডটি ব্যবহার করে এক মাসের শেষ দিনে সর্বদা কিছু কাজ চালানোর বিষয়টি নিশ্চিত করতে এটি ব্যবহার করতে পারি:
0 8 28-31 * * [ "$(date +%d -d tomorrow)" = "01" ] && /your/script.sh