如何设置cronjob 2天?

时间:2009-09-05 06:33:26

标签: cron

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

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

0 0 2 * * * backup-command

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

3 个答案:

答案 0 :(得分:57)

来自here

  

Cron还支持'step'值。

     

dom字段中的*/2值   表示该命令每两天运行一次   同样地,*/5在小时字段中   意味着命令每5个运行一次   小时。 e.g。

* 12 10-16/2 * * root backup.sh
     

与:

相同
* 12 10,12,14,16 * * root backup.sh

所以我认为你想要0 0 */2 * *

你所拥有的(0 0 2 * *)将在每个月的第二个月的每个月运行该命令。

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

minute hour dom month dow user cmd

因此,您的额外星号将位于user字段中。那是为了吗?

答案 1 :(得分:6)

免责声明:这是我的deleted回复here的副本。我相信这个问题更像是 canonical ,我的答案在这里更合适。

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

  • 我想在每个月的第二天安排一个cron工作。
  • 我想每两天安排一次cron工作。

由于一个月内的天数,这两种情况完全不同。

我想在每个月的第二天安排一个cronjob。

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

  

man 5 crontab :步骤值可与范围结合使用。在/<number>的范围之后指定了跳过   数字在整个范围内的值。例如,可以使用0-23/2   在&#39;小时&#39;字段,指定每隔一小时执行一次命令   (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
  • command1将在每个奇数日的00:00执行(默认范围为步骤2,即1,3,5,7,...,31)
  • command2将在每个偶数日的00:00执行(即2,4,6,8,......,30)
  • 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

你可以轻松调查它是奇数还是偶数。但是,在执行此操作时,您将在12月31日和1月1日的常见年份(365天;闰年有366天)再次出现问题。当您拥有特定日期的连续计数器时,可以解决此问题。输入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

让cronjob仅在command400:00每隔一天运行command5,每隔一天00:00开始{&#34; 2018-03-14&# 34 ;, 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

daytestcmd定义为

#!/usr/bin/env bash
# get start time in seconds
start=$(date -d "${2:-@0}" '+%s')
# get current time in seconds
now=$(date '+%s')
# get the amount of days (86400 seconds per day)
days=$(( (now-start) /86400 ))
# set the modulo
modulo=$1
# do the test
(( days >= 0 )) && (( days % modulo == 0))

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

备注: UNIX时间不受闰秒的影响

答案 2 :(得分:2)

如果您想使用crontab -e命令,请尝试以下时间模式:

0 1 */2 * * command_to_execute

或者,您可以尝试使用SetCronJob来获取基于Web的解决方案。您可以使用第二个创建行每2天轻松创建一次cron作业。