Linux 交替cron作业问题

Linux 交替cron作业问题,linux,cron,Linux,Cron,我试图让cron作业每隔一天运行……因此,如果一个作业今天运行,另一个作业明天运行,依此类推。我知道 * * */2 * * command 将每隔一天运行一次…但我需要另一个在一年中被抵消,无论是哪一天…有没有想过每隔一天会运行什么命令?我知道两种方法,这两种方法都有不同的丑陋之处 有暴力: 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,2

我试图让cron作业每隔一天运行……因此,如果一个作业今天运行,另一个作业明天运行,依此类推。我知道

* * */2 * * command

将每隔一天运行一次…但我需要另一个在一年中被抵消,无论是哪一天…有没有想过每隔一天会运行什么命令?

我知道两种方法,这两种方法都有不同的丑陋之处

有暴力:

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 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。

您可以运行以下BASH one命令作为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

您可以运行下面的BASH one命令作为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

这是一个让你开始的表达

if ((c=`date -d 3/13/2012 -u +%s` / 86400 % 2 == 1)); then echo odd; else echo even; fi
命令日期-u+%s返回自1970年1月1日00:00:00 UTC以来的秒数。u选项使其在开始和结束时间都使用UTC,因此结果与时区无关。然后除以86400计算天数,然后确定是偶数还是奇数。对于奇数,返回代码为0 shell true;对于偶数,返回代码为1 shell false

与其他解决方案相比,这种方法的优势在于,它不会在一个月或一年的边界上提供连续两个偶数或赔率,因为它从1970年1月1日开始计算,不考虑年或月


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

以下是一个开始的表达式

if ((c=`date -d 3/13/2012 -u +%s` / 86400 % 2 == 1)); then echo odd; else echo even; fi
命令日期-u+%s返回自1970年1月1日00:00:00 UTC以来的秒数。u选项使其在开始和结束时间都使用UTC,因此结果与时区无关。然后除以86400计算天数,然后确定是偶数还是奇数。对于奇数,返回代码为0 shell true;对于偶数,返回代码为1 shell false

与其他解决方案相比,这种方法的优势在于,它不会在一个月或一年的边界上提供连续两个偶数或赔率,因为它从1970年1月1日开始计算,不考虑年或月


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

我向任何能将奇偶脚本转换成一行的开明精神鞠躬。我向任何能将奇偶脚本转换成一行的开明精神鞠躬。我不明白为什么它不起作用,但是我更喜欢无状态,这样我就不必担心权限混乱、完整磁盘等问题。此外,我建议将一行代码放入脚本中。不明白为什么它不起作用,但我更喜欢无状态,这样我就不必担心权限混乱、完整磁盘等问题。还有,我建议将一行代码放入脚本中。我刚结束使用php,为每个进程编写了两个脚本。我刚结束使用php,为每个进程编写了两个脚本