我试图让cron工作在隔天运行......所以如果今天运行,另一个将在明天运行,依此类推。我知道
* * */2 * * command
将每隔一天运行一次......但是我需要另一个人在一年中抵消,无论什么日期...任何想法会在隔天运行什么命令?
答案 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 true),对于even,返回码为1(shell false)。
这比其他解决方案的优势在于,它不会在一个月或一年的边界连续给你两个平均值或几率,而且从1970年1月1日算起,而不考虑几年或者几个月。
请注意,此方法并不完美。由于偶尔添加了闰秒,这种方法可能会在午夜的几秒钟内做出错误的决定。