如何调用 crontab 命令,以便根据某些条件安排运行 20 分钟延迟的脚本?
编辑:如果我想要一个命令来安排脚本仅执行与系统中条件评估为 true 一样多的次数,该怎么办?我有什么选择?
答案1
将用于测试条件的逻辑代码放在脚本本身中,不要尝试将其放入(或将其与)cron 关联 - 复杂的逻辑不是 cron 的设计目的。
因此,您可以在脚本中测试条件,如果计算结果为 true,则处理代码将运行。如果计算结果为 false,则彻底退出脚本。
假设您的“条件”因处理脚本而发生变化(例如,监视文件夹中是否有需要处理的传入文件,并每 20m 处理一个文件),那么最终您的条件将始终评估为 false,因为所有工作都已完成完毕。
从您的评论来看,您似乎正在监视某些服务器的可用性。
我不怎么用 bash 做太多事情,但是这个怎么样:
#!/bin/bash
if [ `ps ax | grep $0 | wc -l` -le 3 ]; then #1
if [ `arping ...` -ne 1 ]; then #2
sleep 1200
if [ `arping ...` -eq 1 ]; then #3
# do your processing here
fi
fi
fi
第一个 if 语句 (#1) 确保这是正在运行的特定脚本的唯一实例。如果另一个脚本(仍在)运行,我们将退出并且不执行任何操作。
第二个 (#2) 是您最初的“主机是否可 ping 通”测试。如果不是,则脚本会等待 1200 秒(20 分钟),然后再次测试 (#3)。
因此,如果两次 ping(相隔 20 分钟)表明您的主机已变得可达,然后您的处理代码将运行。
如果您想稍微简化一下,请尝试以下操作:
#!/bin/bash
if [ `arping -w 59 ...` -ne 1 ]; then
sleep 1079
if [ `arping -w 59 ...` -eq 1 ]; then
# do your processing here
fi
fi
如果您为检查设定了略低于 1 分钟 (-w 59) 的 arping 截止时间,并调整睡眠量,那么您几乎可以保证两个测试和之间的睡眠将在 20 分钟内完成,因此不应与相邻时间段重叠,并且无需检查另一个脚本是否仍在运行。
当然,上述任一脚本都可以通过每 20 分钟运行一次的静态 cron 条目来调用:
*/20 * * * * /path/to/script.sh
答案2
您必须构建一个 bash 脚本来检查条件并为其分配睡眠。然后使用 cron 安排该 bash 脚本在特定时间运行。 Cron 本身不支持条件或“延迟后运行”。
答案3
好的,您现在将问题更新为几分钟。
因此,您将每 20 分钟跑步一次 = 在所有小时中的 0 / 20 / 40 / 60 (=0) 分钟跑步。
该条目将是:
0,20,40 * * * * /path/to/some_command
如果您想执行有限的次数,请使用状态文件来存储您启动该脚本的次数。