মাসের শেষ দিনে চালানোর জন্য CRON কাজ job


97

আমার একটি সিআরএন জব তৈরি করা দরকার যা প্রতি মাসের শেষ দিনে চলবে। আমি এটি সিপ্যানেল ব্যবহার করে তৈরি করব।

কোন সাহায্য প্রশংসা করা হয়। ধন্যবাদ

উত্তর:


188

সম্ভবত সহজতম উপায় হ'ল তিনটি পৃথক কাজ করা:

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পারেন। সরলতার কারণে উপরের কোডটি আমলে নিবে না।


8
হ্যাঁ, শেষ দিনের পরিবর্তে প্রতিটি প্রথম দিন চালানো সহজ হতে পারে :)
উত্কু ডালমাজ

4
সত্যই মাসের প্রথম দিন। কোডটি পিএইচপি like তারিখ = নতুন ডেটটাইম ('2013-03-01') তে কেমন দেখবে তা এখানে; $ তারিখ-> পরিবর্তন করুন ('- 1 মাস'); ; পূর্ববর্তীকাল = $ তারিখ-> ফর্ম্যাট ('ওয়াই-এম'); // $ পূর্ববর্তীকাল এখন 2013-02। আগের মাসের জন্য পণ্য আনতে কোয়েরি তৈরি করুন।
ইয়াসেন

লিপ ইয়ার ফেব্রুয়ারী 29 তথ্য হারিয়ে যাবে, আমাদের এটিও বিবেচনা করা উচিত। নীচে থান্ডার খরগোশের উত্তরটি বিবেচনা করুন তবে লিপ বছরের ফেব্রুয়ারীতে ক্রোন দুবার চালিত হবে
হরি স্বামীনাথন

4
@ হরি, পছন্দসই সমাধানটি হ'ল মাসের প্রথম দিকে চালানো এবং পূর্ববর্তী মাসের ডেটা সংগ্রহ করা। ২৯ শে ফেব্রুয়ারি সেই ক্ষেত্রে মিস করা হবে না।
paxdiablo

4
লিপ বছর বিবেচনা করে: এবং যদি আপনি এটি দুবার চালাতে আপত্তি না করেন: 55 23 28,29 2 * myjob.sh
আলোড়নকারী রেজোর

53

একটি সামান্য খাটো পদ্ধতি রয়েছে যা উপরের যে কোনও একটির মতো ব্যবহার করা যেতে পারে। এটাই:

[ $(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

আমি এটি ক্রন্টব এন্ট্রি হিসাবে কাজ করতে পারি না (আমার মনে হয় কিছু এড়ানোর দরকার আছে)। এটি crontab থেকে ডাকা একটি শেল স্ক্রিপ্টে দুর্দান্ত কাজ করেছে। এফওয়াইআই, আমি যে ত্রুটি পেয়েছিলাম তা ছিল /bin/sh: -c: line 1: unexpected EOF while looking for matching ')'
রাজকক

13
এটি দুর্দান্ত কাজ করে। ক্রোনট্যাব ফাইলে অবশ্যই%% কে পালাতে হবে। সুতরাং[ $(date -d +1day +\%d) -eq 1 ] && run_job
কলিনম

সত্যিই দুর্দান্ত কৌশল! তবে প্রশ্নটি ট্যাগ করা হয়েছিল posixএবং পসিক্স তারিখ সমর্থন করে না "-d +1day": - more আরও জটিল (এবং [ `date +\%d` -eq `cal | xargs echo | awk '{print $NF}'` ] && myscript.sh
কুরুচিপূর্ণ

15

মাসের প্রথম দিনটিতে চালনার জন্য ক্রোন জব সেট আপ করুন। তারপরে সিস্টেমের ঘড়িটি একদিন আগে পরিবর্তন করুন।


11
যার অর্থ সিস্টেমের ঘড়িটি সর্বদা ভুল থাকবে। দুঃখিত তবে আমি মনে করি এটি আরও সমস্যার কারণ হবে। -1 তারপর।
রুডি

71
এখন আমি জানি গ্যালিলিও কেমন অনুভব করেছিলেন।
টম অ্যান্ডারসন

7
@ আইকনোক্লাস্ট: আমি এটাকে রসিকতার চেয়ে কোয়ান বেশি ভাবতে চাই।
টম অ্যান্ডারসন

15
আমি মনে করি এটি সত্যিই খারাপ এবং উজ্জ্বল ধারণা। বাচ্চারা ঘরে এটি করবেন না।
পাস্কাল

12
@ প্যাস্কালবেটজ ওহ, লোকেরা বাড়িতে এটি করতে পারে, তবে তাদের কাজটি করা উচিত নয় n't
টম অ্যান্ডারসন

14

উইকিপিডিয়া পরে এই সম্পর্কে কি?

55 23 L * * /full/path/to/command

আচ্ছা, এটা কি? যে: "ক্রোনটব ফাইলে খারাপ মাসের ত্রুটিগুলি ইনস্টল করতে পারে না you আপনি কি একই সম্পাদনা আবার চেষ্টা করতে চান?"
ওয়েবজুনকি

12
কেবল স্পষ্ট করে বলতে গেলে, উইকিপিডিয়া প্রবেশে "এল" মানহীন বলেও উল্লেখ করা হয়েছে।
sdupton

10

প্যাক্সিডিয়াবলোর সমাধানটি গ্রহণ করে, আমি ২৮ শে এবং ২৯ শে ফেব্রুয়ারি চালাচ্ছি । 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

4
অবশ্যই, যদি না এই কাজের কিছু ধ্বংসাত্মক দিক রয়েছে যেমন প্রক্রিয়াজাতকরণের সাথে সাথে সমস্ত ডেটা সাফ করা :-)
প্যাক্সিডিয়াব্লো

এটি আসলে একটি যন্ত্রণাহীন বিকল্প (অন্তত প্রযুক্তিগত), এবং আপনি যে তিনবার 4 বছর আপনি cronjob খুব তাড়াতাড়ি আপনি শুধু বর্জন পাবেন গ্রাহ্য না পারে ,29
ম্যাট

@ ম্যাট: উম্ম, আপনি কি বোঝাতে চাইছেন না যে আপনার ক্রন্টব এন্ট্রি বললে চার বছরে একবার খুব তাড়াতাড়ি একদিন চলে55   23   28    2 ?
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

@ জি-ম্যান হ্যাঁ, আপনি ঠিক বলেছেন, এবং তারপরে, আপনি এটি ২ য় তারিখে দ্বিতীয়বার চালিয়েছেন।
ম্যাট

8

আপনি মাসের প্রতিটি দিন চালনার জন্য ক্রোন জব সেট আপ করতে পারেন এবং এটি নীচের মত শেল স্ক্রিপ্ট চালাতে পারেন। এই স্ক্রিপ্টটি আগামী দিনের দিনের সংখ্যা আজকের তুলনায় কম (যেমন আগামীকাল যদি নতুন মাস হয়) এবং তারপরে আপনি যা চান তা কার্যকর করে।

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

আজকের চেয়ে কম কিনা তা যাচাই করে আপনি কী অর্জন করেছেন তা আমি নিশ্চিত নই - আপনার কেবল এটি 1 ম হয় কিনা তা খতিয়ে দেখতে সক্ষম হওয়া উচিত। মাসের প্রথম দিনটি দ্বিতীয় বা তৃতীয় :-) হতে পারে না
paxdiablo

7

একটি নিম্নলিখিতরূপে crontab পরিবর্তন @Indie সমাধান উপর ভিত্তি করে একটি নিরাপদ পদ্ধতি (পথটি ব্যবহার করার জন্য date+ + $()সব নিম্নলিখিতরূপে crontab পরিবর্তন সিস্টেমে কাজ করে না):

0 23 28-31 * * [ `/bin/date -d +1day +\%d` -eq 1 ] && myscript.sh

6

কিছু ক্রোন বাস্তবায়ন মাসের শেষ দিনটিকে উপস্থাপন করতে "এল" পতাকা সমর্থন করে।

আপনি যদি এই বাস্তবায়নগুলির মধ্যে একটি ব্যবহার করে ভাগ্যবান হন তবে এটি এতটা সহজ:

0 55 23 L * ?

এটি প্রতি মাসের শেষ দিন রাত 11:55 এ চলবে।

http://www.quartz-scheduler.org/docamentation/quartz-1.x/tutorials/crontrigger


5
#########################################################
# 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" 

5

এডাব্লুএস ক্লাউডওয়াচ ক্রোন বাস্তবায়নের জন্য (লাম্বডাস শিডিউলিং ইত্যাদি) এটি কাজ করে:

55 23 L * ? *

প্রতি মাসের শেষ দিন রাত 11:55 এ চলছে।



3

আপনি কেবলমাত্র একটি উত্তর ক্রোন লাইনে সংযুক্ত করতে পারেন এবং কেবল dateকমান্ড ব্যবহার করতে পারেন ।

আজকের মাসের দিনের মধ্যে পার্থক্যটি যা আজ এবং কাল হবে তা পরীক্ষা করে দেখুন:

0 23 * * * root [ $(expr $(date +\%d -d '1 days') - $(date +\%d)  ) -le 0 ]  && echo true

যদি এই পার্থক্যটি 0 এর নীচে হয় তবে এর অর্থ হ'ল আমরা মাসটি পরিবর্তন করি এবং মাসের শেষ দিন থাকে।


3
55 23 28-31 * * echo "[ $(date -d +1day +%d) -eq 1 ] && my.sh" | /bin/bash 

4
ক্রমানের সাথে কাজ করার সময় কমান্ডটি প্রতিধ্বনিত করা এবং এটিকে ব্যাশে পাইপ করা সর্বোত্তম উপায়। যেহেতু ক্রোন ব্যাশ নয় শ ব্যবহার করছে। আপনার বাশ কোথায় 'কোন বাশ' ব্যবহার করছে তা পরীক্ষা করুন। ফ্রিবিএসডি-তে এটি / ইউএসআর / স্থানীয় / বিন / বাশ, লিনাক্স / বিন / বাশে রয়েছে।
ডোনাল্ড ডাক

2

এই সম্পর্কে কি?

ব্যবহারকারীর .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

1

মাসের শেষ দিনটি কোন মাসের (ফেব্রুয়ারি, মার্চ ইত্যাদি) এর উপর নির্ভর করে 28-31 হতে পারে। তবে এর মধ্যে যে কোনও একটিতে পরের দিনটি সর্বদা পরের মাসের 1 ম। সুতরাং আমরা নীচের কোডটি ব্যবহার করে এক মাসের শেষ দিনে সর্বদা কিছু কাজ চালানোর বিষয়টি নিশ্চিত করতে এটি ব্যবহার করতে পারি:

0 8 28-31 * * [ "$(date +%d -d tomorrow)" = "01" ] && /your/script.sh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.