bash 脚本中的条件 crontab 命令

bash 脚本中的条件 crontab 命令

如何调用 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

如果您想执行有限的次数,请使用状态文件来存储您启动该脚本的次数。

相关内容