我需要创建一个将在每月最后一天运行的 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
不过,该操作将于 2 月 28 日运行,即使是闰年,因此,如果这是一个问题,您需要找到其他方法。
<小时/>但是,在每个月的第一天尽快运行作业通常会更容易、更正确,例如:
0 0 1 * * myjob.sh
并修改脚本以处理上个月的数据。
这消除了您在确定哪一天是该月最后一天时可能遇到的任何麻烦,并且还可以确保该月的所有数据都可用(假设您正在处理数据)。在该月最后一天到午夜前五分钟运行可能会让您错过从那时到午夜之间发生的任何事情。
对于大多数月末工作来说,无论如何,这是通常的做法。
<小时/>如果您仍然确实想在该月的最后一天运行它,一个选择是简单地检测明天是否是第一个(作为脚本的一部分,或者在 crontab 本身中) )。
所以,类似:
55 23 28-31 * * [[ "$(date --date=tomorrow +\%d)" == "01" ]] && myjob.sh
假设您有一个相对智能的日期
程序,这应该是一个好的开始。
如果您的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
。为了简单起见,上面的代码没有考虑到这一点。
关于automation - CRON 作业在该月的最后一天运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139189/