我想每隔一个星期二早上 05.15 运行一个命令。有没有办法做到这一点?
答案1
周二 05:15 运行作业的 cron 计划是
15 5 * * 2
或使用日期名称(可能并非所有地方都支持),
15 5 * * tue
让命令在该计划触发时每秒运行一次的最简单方法是让 cron 作业将其状态保留为临时文件。如果该文件存在,则会将其删除,但该作业不会执行其他操作。如果该文件不存在,则运行该命令,然后作业创建该文件。
所以你的日程安排可能是这样的:
15 5 * * 2 if [ -e /tmp/statefile ]; then rm -f /tmp/statefile; else cmd; touch /tmp/statefile; fi
显然(?)如果将业务逻辑封装在由 cron 计划触发的 shell 脚本中,这会更清晰:
15 5 * * 2 /some/path/cron-wrapper
shellcron-wrapper
脚本可能如下所示:
#!/bin/sh
statefile=/tmp/statefile
if [ -e "$statefile" ]; then
rm -f "$statefile"
exit
fi
cmd # the command we want to run
touch "$statefile"
请注意,这不会注意保留命令的退出状态(cmd
在上面的示例中)。如果您需要这样做,例如让 cron 通知您运行失败,请确保您的包装器脚本以命令的退出状态退出:
#!/bin/sh
statefile=/tmp/statefile
if [ -e "$statefile" ]; then
rm -f "$statefile"
exit
fi
cmd # the command we want to run
err=$?
touch "$statefile"
exit "$err"
您要在此处使用的确切逻辑取决于您的要求。例如,您是否希望在命令失败时避免创建状态文件?您可能还希望在安全位置的其他位置创建状态文件,该位置不太可能被维护脚本清除,并且不太可能覆盖其他数据或被同一计算机上运行的其他项目覆盖。
这其他做到这一点的方法是采用某种形式的日期计算,如当前接受的类似问题的答案中所述:每隔一周通过 cron 运行一个脚本