交替的cron工作问题

时间:2012-03-12 22:08:27

标签: linux cron

我试图让cron工作在隔天运行......所以如果今天运行,另一个将在明天运行,依此类推。我知道

* * */2 * * command

将每隔一天运行一次......但是我需要另一个人在一年中抵消,无论什么日期...任何想法会在隔天运行什么命令?

3 个答案:

答案 0 :(得分:0)

我知道两种方式,这两种方式都是以不同的方式丑陋。

有蛮力:

0 0 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 * * command
0 0 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * * command

我没有输入这些数字,所以使用解决方案感觉还可以。

然后是包装脚本,除了指定的日期之外拒绝运行。把它放在/usr/local/bin/event中,并将其符号链接到`/ usr / local / bin / odd

#!/bin/bash

if [ "$(basename $0)" = "even" ]; then
  EXIT_ON_MATCH=1
else
  EXIT_ON_MATCH=0
fi

if [ "$(expr $(($(date --utc +%s)/86400)) % 2)" = "$EXIT_ON_MATCH" ]; then
  exit 1
fi

$@

然后做

0 0 * * * /usr/local/bin/even command
0 0 * * * /usr/local/bin/odd command

在合理的时间内替换0 0

答案 1 :(得分:0)

您可以运行以下BASH one-liner作为您的cron命令。我使用$ HOME / mycron作为存储下一个要运行的命令的编号的文件,但是您可以将其设置为运行cron作业的用户可写的任何位置/文件。用运行第二个和第一个命令的实际命令替换“echo'run cmd1'”和“echo'run cmd2'”部分(是的,该命令是有意的)。

0 6 * * * if [ -e $HOME/mycron ]; then WHICH=`cat $HOME/mycron`; if [ $WHICH -eq 2 ]; then echo 'run cmd2'; echo 1 > $HOME/mycron; else echo 'run cmd1'; echo 2 > $HOME/mycron; fi; fi

答案 2 :(得分:0)

这是一个让你入门的表达

if ((c=`date -d 3/13/2012 -u +%s` / 86400 % 2 == 1)); then echo odd; else echo even; fi

命令date -u +%s返回1/1/1970 00:00:00 UTC后的秒数。 -u选项使其在开始和结束时间都使用UTC,因此结果与时区无关。然后它除以86400来计算天数,然后确定它是偶数还是奇数。对于odd,返回码将为0(shell tr​​ue),对于even,返回码为1(shell false)。

这比其他解决方案的优势在于,它不会在一个月或一年的边界连续给你两个平均值或几率,而且从1970年1月1日算起,而不考虑几年或者几个月。

请注意,此方法并不完美。由于偶尔添加了闰秒,这种方法可能会在午夜的几秒钟内做出错误的决定。