调度具有特殊条件的 cron 作业

调度具有特殊条件的 cron 作业

有没有办法让 cron 作业因特殊情况自动重新安排?

举一个简单的例子,遇到假期,工资单处理需要比 cron 中计划的晚一天运行

这可以通过脚本、配置、环境变量来实现吗?还是需要有人手动进行更改?

答案1

这不是 cron 支持的东西。但可以创建一个脚本来解决您的问题。

进入您的示例,您应该有某种议程/列表,其中存储流程应运行的日期。

然后,您应该创建一个 crontab 条目,每天运行一个脚本来检查议程/列表中的日期是否匹配。如果没有,则什么也不做。但如果有匹配,则启动该过程。

答案2

对于简单的情况,是的,但是对于中等复杂的情况,您将需要围绕工资作业编写一个包装脚本。

例如,您的 cron 作业不必直接运行工资单处理程序。它可以(并且可能应该,如果还没有的话)通过包装脚本运行它。

比如说,一个名为“myjob.sh”的脚本,如下所示:

#!/bin/bash

delayfile=/path/to/myjob.delay

if [ -e "$delayfile" ] ; then
  sleep $(cat "$delayfile)
  rm "$delayfile"
fi

# now set up whatever variables etc are needed and
# execute the actual payroll processing program

为了延迟下一个(并且仅在下一次)运行 cron 作业一天后,您只需运行类似以下内容(从 shell,作为有权在该目录中创建该文件的用户):

echo 86400 > /path/to/myjob.delay

上面的脚本片段假设 cron 作业不是每天运行 - 如果是的话,下一个实例将在睡眠结束的同时运行。

如果该作业每天运行,那么您可以这样做:

#!/bin/bash

skipfile=/path/to/myjob.skip

if [ -e "$skipfile" ] ; then
  rm "$skipfile"
  exit 0
fi

# now set up whatever variables etc are needed and
# execute the actual payroll processing program```

如果跳过文件存在(例如,如果您touch /path/to/myjob.skip在 shell 中运行),脚本将删除它并立即退出。 cron 作业的下一次运行将正常完成。

这些都是很简单示例,只是为了让您对可能性有一个最简单的了解。该脚本可以执行任何需要执行的操作来检查条件、根据需要进行复杂程度、运行任何外部程序、在数据库中查找条目、查询远程 Web 服务器的 json API 等等。

你可以在 cron 本身中做相对简单的事情,例如上面的内容足够简单,你可以在 cron 中完成它们:

每周版本:

00 01 * * 7 [ -e /path/to/myjob.delay ] && sleep $(cat /path/to/myjob.delay) && rm /path/to/myjob.delay && your-payroll-program

每日版本:

00 01 * * * [ -e /path/to/myjob.skip ] && (rm /path/to/myjob.skip && exit 0) || your-payroll-program

在我看来,您最好使用包装脚本 - 更易于阅读,更易于维护,并且您可以使用您喜欢的任何脚本语言,而不仅仅是 sh 或 bash。另外,在一系列逻辑上与-ed/or-ed子句中你可以合理做的事情是有限的,在一句台词变成难以理解的胡言乱语之前你可以合理做的事情也有限制。在一个脚本中结合跳过和延迟功能是非常容易的,但作为一个单行或 crontab 条目却很难做到。

相关内容