如何设置cronjob 2天?

35 cron

我们想使用cronjob来创建数据库备份.

备份应该每两天进行一次.可以使用以下cron-entry吗?

0 0 2 * * * backup-command
Run Code Online (Sandbox Code Playgroud)

如果这是错误的,请告诉我设置cron 2天的正确命令.

Dom*_*ger 62

这里:

Cron还支持'step'值.

*/2dom字段中的值意味着命令每两天运行一次,同样,*/5在小时字段中意味着命令每5小时运行一次.例如

* 12 10-16/2 * * root backup.sh
Run Code Online (Sandbox Code Playgroud)

是相同的:

* 12 10,12,14,16 * * root backup.sh
Run Code Online (Sandbox Code Playgroud)

所以我想你想要0 0 */2 * *.

你有什么(0 0 2 * *)将在每个月的第二个月,每个月运行命令.

ps你的答案中似乎有一个额外的星号.格式应为:

minute hour dom month dow user cmd
Run Code Online (Sandbox Code Playgroud)

所以你的额外星号将在user现场.这是有意的吗?


kva*_*our 8

免责声明:这是我在此处deleted回答的副本。我确实相信这个问题更规范,我的回答在这里更合适。

有两种方法可以解释此问题。

  • 我想安排每月第二天进行一次Cron工作。
  • 我想每两天安排一次Cron工作。

这是两种完全不同的情况,因为一个月中有多少天。

我想安排每月第二天进行一次cronjob。

为此,我们结合使用定义范围和步长值:

man 5 crontab步长值可以与范围一起使用。跟随带有的范围时,将/<number>指定数值在范围内的跳过。例如,0-23/2可以在“小时”字段中使用,以指定每隔一小时执行一次命令(V7标准中的替代方法是 0,2,4,6,8,10,12,14,16,18,20,22)。在星号后也可以使用步进值,因此,如果指定每两个小时运行一次作业,则可以使用*/2

请参阅以下示例:

# Example of job definition:
# .-------------------- minute (0 - 59)
# |  .----------------- hour (0 - 23)
# |  |  .-------------- day of month (1 - 31)
# |  |  |      .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |      |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |      |  |
# *  *  *      *  *   command to be executed
  0  0  */2    *  *   command1
  0  0  2-31/2 *  *   command2
  *  *  */2    *  *   command3
Run Code Online (Sandbox Code Playgroud)
  • command1 将在每个奇数日的00:00执行(步骤2的默认范围,即1,3,5,7,...,31)
  • command2 将在每个偶数日(即2,4,6,8,...,30)的00:00执行
  • command3是一个经常犯的错误。这将在每个奇数日的每一分钟运行。

注意:应该理解,这种方法command1将在1月31日和2月1日(连续2天)运行

注意:应该理解,这种方法command2将跳过1月31日和2月1日,并且仅在3天后运行。

我想每两天安排一次cronjob(从第X天开始)

在这里,它变得更加有趣。上面的注释已经证明了问题所在,即几个月的天数奇数。

快速思考的方法是评估一年中的某天:

% date -d "2018-01-31" '+%j'
031
% date -d "2018-02-01" '+%j'
032
Run Code Online (Sandbox Code Playgroud)

并且您可以轻松地调查它是奇数还是偶数。但是,这样做时,在同一年份(365天; leap年有366天),在12月31日和1月1日再次遇到问题。当您从给定的日期开始有连续的计数器时,可以解决此问题。输入UNIX时间戳记,自以来的总秒数1970-01-01 00:00:00 UTC

% date -d "2018-12-31" '+%s %j'                                                                                                                                                                                                               
1546214400 365
% date -d "2019-01-01" '+%s %j' 
1546300800 001
% date -d "2019-12-31" '+%s %j'                                                                                                                                                                                                               
1577750400 365
% date -d "2020-01-01" '+%s %j'                                                                                                                                                                                                               
1577836800 001
Run Code Online (Sandbox Code Playgroud)

对于command4仅在“ 2018-03-14”开始的第二天00:00command5第三天运行的cronjob 00:00,crontab如下所示:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  0  0  *  *  *   daytestcmd 2 && command4
  0  0  *  *  *   daytestcmd 3 20180314 && command5
Run Code Online (Sandbox Code Playgroud)

daytestcmd定义为

# Example of job definition:
# .-------------------- minute (0 - 59)
# |  .----------------- hour (0 - 23)
# |  |  .-------------- day of month (1 - 31)
# |  |  |      .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |      |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |      |  |
# *  *  *      *  *   command to be executed
  0  0  */2    *  *   command1
  0  0  2-31/2 *  *   command2
  *  *  */2    *  *   command3
Run Code Online (Sandbox Code Playgroud)

备注: UNIX时间以UTC给出。如果您的cron在受夏时制影响的其他时区中运行,建议不要在2到3点之间运行该命令。这可能会跳过命令或运行命令两次(取决于时间是向前还是向后跳跃)

备注: UNIX时间不受leap秒影响