35 cron
我们想使用cronjob来创建数据库备份.
备份应该每两天进行一次.可以使用以下cron-entry吗?
0 0 2 * * * backup-command
Run Code Online (Sandbox Code Playgroud)
如果这是错误的,请告诉我设置cron 2天的正确命令.
Dom*_*ger 62
从这里:
Cron还支持'step'值.
*/2
dom字段中的值意味着命令每两天运行一次,同样,*/5
在小时字段中意味着命令每5小时运行一次.例如Run Code Online (Sandbox Code Playgroud)* 12 10-16/2 * * root backup.sh
是相同的:
Run Code Online (Sandbox Code Playgroud)* 12 10,12,14,16 * * root backup.sh
所以我想你想要0 0 */2 * *
.
你有什么(0 0 2 * *
)将在每个月的第二个月,每个月运行命令.
ps你的答案中似乎有一个额外的星号.格式应为:
minute hour dom month dow user cmd
Run Code Online (Sandbox Code Playgroud)
所以你的额外星号将在user
现场.这是有意的吗?
免责声明:这是我在此处deleted
回答的副本。我确实相信这个问题更规范,我的回答在这里更合适。
有两种方法可以解释此问题。
这是两种完全不同的情况,因为一个月中有多少天。
为此,我们结合使用定义范围和步长值:
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天后运行。
在这里,它变得更加有趣。上面的注释已经证明了问题所在,即几个月的天数奇数。
快速思考的方法是评估一年中的某天:
% 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:00
和command5
第三天运行的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秒影响