如何将cronjob设置为2天?

如何将cronjob设置为2天?,cron,Cron,我们希望使用cronjob创建数据库备份 备份应每两天进行一次。是否可以使用以下cron条目 0 0 2 * * * backup-command 如果这是错误的,请告诉我设置cron 2天的正确命令。来自: Cron还支持“step”值 dom字段中的值为*/2 意味着命令每两天运行一次 同样,在小时字段中,*/5 这意味着命令每5分钟运行一次 小时。e、 g * 12 10-16/2 * * root backup.sh 同: * 12 10,12,14,16 * * root back

我们希望使用cronjob创建数据库备份

备份应每两天进行一次。是否可以使用以下cron条目

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

来自:

Cron还支持“step”值

dom字段中的值为
*/2
意味着命令每两天运行一次 同样,在小时字段中,
*/5
这意味着命令每5分钟运行一次 小时。e、 g

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

* 12 10,12,14,16 * * root backup.sh
所以我想你想要
0*/2**

您所拥有的(
02**
)将在每月2号午夜运行该命令

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

minute hour dom month dow user cmd

因此,额外的星号将出现在
user
字段中。这是有意的吗?

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

0 1 */2 * * command_to_execute
或者,您可以尝试基于web的解决方案。使用第二个创建行,您可以很容易地每两天创建一次cron作业。

免责声明:这是我的
已删除
答案的副本。我相信这个问题更符合规范,我的答案更适合这里

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

  • 我想在每个月的第二天安排一个cron作业
  • 我想每两天安排一次cron作业
这是两种完全不同的情况,因为一个月有多少天

我想在每个月的第二天安排一份工作。 为此,我们使用定义范围和步长值的组合:

man 5 crontab
阶跃值可与范围一起使用。在带有
/
的范围之后指定 数字在整个范围内的值。例如,可以使用
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
  • command1
    将在奇数天的00:00执行(步骤2的默认范围,即1,3,5,7,…,31)
  • command2
    将在每个偶数天的00:00执行(即2,4,6,8,…,30)
  • command3
    是经常犯的错误。这将在奇数天的每一分钟运行
注意:应该理解,在这种方法中,
command1
将在1月31日和2月1日(连续两天)运行

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

我想每隔一天安排一次cronjob(从第X天开始) 在这里它变得更有趣。上面的注释已经说明了月份天数为奇数的问题

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

% date -d "2018-01-31" '+%j'
031
% date -d "2018-02-01" '+%j'
032
你可以很容易地调查它是奇数还是偶数。但是,在执行此操作时,在普通年份(365天;闰年有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
从“2018-03-14”开始,cronjob仅在第二天
00:00
运行
command4
,在第三天
00:00
运行
command5
,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
#以秒为单位获取开始时间
开始=$(日期-d“${2:-@0}”'+%s')
#以秒为单位获取当前时间
现在=$(日期'+%s')
#获取天数(每天86400秒)
天数=$((现在开始)/86400))
#设模
模=1美元
#做测试
((天>=0))&&((天%模==0))
备注:UNIX时间以UTC为单位。如果您的cron运行在受夏令时影响的不同时区,建议不要在2点到3点之间运行该命令。这可能会跳过命令或运行命令两次(取决于时间是向前跳还是向后跳)


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

一些传说中的实现也包含秒字段,尽管我在野外从未见过。
*/2
很清楚,但是
10-16/2
这是什么意思?它不应该是
daytestcmd 2
daytestcmd 3
?Shell函数和脚本的参数不在括号中。另一个建议(主要是修饰性的):在
daytestcmd
中,您可以使用
((天%modulo==0))
而不是
[[[$((天%modulo))==0]]
@BenjaminW Updated没有向我显示crontab格式,该格式在本地系统中易于手动使用。我怎么能找到呢?