题 每3天在Crontab中运行一次脚本


我有一些需要每3天运行一次的Perl脚本,以下是我输入的语法,请你告诉我,这是对还是错。

30 19    * * */3   root   /var/scripts/svn_backup.pl

5
2018-03-11 05:15






答案:


这是不对的。最后一列是星期几。你可能想要搬家 */3 到第三列(每月的一天):

*     *     *     *     *      command to be executed
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- day of week (0 - 6) (Sunday=0)
|     |     |     +------- month (1 - 12)
|     |     +--------- day of month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

10
2018-03-11 05:55



它应该是这样的:30 19 * / 3 * * root /var/scripts/svn_backup.pl - Caterpillar
是。您的Perl脚本将每隔三天19:30运行一次。 - quanta
这不会在30日再次运行吗?所以两天之间会有4天? - Peon
我打算说是的,但它似乎在28日和另一个答案中提到的1日再次运行(证据: goo.gl/PSwY4)。你的观点是有效的,因为它只会在30天(4月/ 6月/ 9月/ 11月)的月份留下3天的差距。除闰年2月外,所有其他月份的差距为1天。选择两个工作日可能会产生更一致的结果(例如周二和周五: 30 19 * * 2,5)。 - deizel
因为这不是“每三天”,而是“每三天一次,有时甚至更频繁”。 (参见@ lain的答案)根据OP的情况,您的答案可能会造成一些损害。我不是btw的downvoter,但也许你应该添加一个关于这个陷阱的说明。 - Karma Fusebox


* / 3在您的规范应该是错误的列中

30 19 */3 * * root /var/scripts/svn_backup.pl 

* / 3语法与1,4,7 ... 25,28,31相同。请注意,它将在31个月运行几个月ST 而下个月它将在1上运行ST 因为区间规范不包装,它们总是从序列的开头开始。在这种情况下,脚本将在没有所需间隔的情况下运行。

如果您需要每3天运行一次,那么您必须每天运行脚本并确定是否已经过了3天并且适当地退出/继续。

在perl你可以做类似的事情

if ( int (time/86400)%3 != 0)  {exit 0};

这将基于UNIX纪元每3天运行一次脚本。


13
2018-03-11 07:25



如果我必须隔天运行脚本,它应该是30 19 * / 1 * * root /var/scripts/svn_backup.pl我是对的吗? - Caterpillar
@Caterpillar:不,* / 1与*它每天都会运行相同。 * / 2将是每隔一天,但它会偶尔在一个月的最后一天和另一天的第一天没有跳过一天。 - Iain
@lain,现在我运行所有脚本2天一次,即脚本在31日运行而不是在下个月2日运行,它在本月1日运行,我不明白。你能告诉我怎么可能。 - Caterpillar
@Caterpillar:我已经回答了这个问题 Note that some months it will run on 31st and the next month it will run on the 1st because the interval specifications do not wrap, they always start at the beginning of a sequence. - Iain