automation - CRON 作业在该月的最后一天运行

标签 automation cron posix

我需要创建一个将在每月最后一天运行的 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/

相关文章:

c - 将 POSIX 信号量的值增加 1 以上

c - 如何在 C 中找到当前机器的完整主机名(主机名和域信息)?

java - 使用selenium时如何关闭windows文件上传窗口

java - 自动完成 Java EE Web 应用程序测试

c++ - 运行时检查失败 #0 - ESP 的值未正确保存

shell - Cron Bad Minute 错误 : "home.cron":0: bad minute crontab: errors in crontab file, 无法安装

facebook - 如何每 5 分钟执行一次查询

java - 通过 HTML 中的文本选择 WebElement

cron - 脚本 cron 蓝调

c - 如何从popen()函数中读取stdout并将其存储在C语言中的char数组中?