我们想使用cronjob来创建数据库备份。
备份应该每两天进行一次。可以使用以下cron-entry吗?
0 0 2 * * * backup-command
如果这是错误的,请告诉我设置cron 2天的正确命令。
答案 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 ,我的答案在这里更合适。
有两种方法可以解释这个问题。
由于一个月内的天数,这两种情况完全不同。
为此,我们使用定义范围和步长值的组合:
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天后运行。
这里变得更有趣。上面的注释已经证明了几个月有奇数天的问题。
快速思考的方法是评估一年中的某一天:
% 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仅在command4
和00: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作业。