bash 脚本中的条件 crontab 命令

Arp*_*ith 4 bash cron scheduling

如何调用 crontab 命令,以便我可以根据某些条件安排运行 20 分钟延迟的脚本?

编辑:如果我想要一个命令来安排脚本执行的次数与系统中条件评估为真的次数一样怎么办?我有哪些选择?

Tim*_*Tim 7

将用于测试您的条件的逻辑代码放在脚本本身中,不要尝试将其放入(或将其与)cron 关联 - 复杂的逻辑不是 cron 的设计目的。

因此,在脚本中测试条件,如果结果为真,则运行处理代码。如果计算结果为 false,则干净地退出脚本。

假设您的“条件”因处理脚本而发生变化(例如,查看文件夹中需要处理的传入文件并每 20 米处理一个文件),那么最终您的条件将一直评估为假,因为所有工作都已完成完毕。

从您的评论看来,您正在监视某些服务器的可用性。

我不会用 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
Run Code Online (Sandbox Code Playgroud)

第一个 if 语句 (#1) 确保这是正在运行的此特定脚本的唯一实例。如果另一个脚本(仍在)运行,我们退出并且不做任何事情。

第二个 (#2) 是您最初的“主机可ping通”测试。如果不是,则脚本在再次测试之前等待 1200 秒(20 分钟)(#3)。

所以,如果两个坪- 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
Run Code Online (Sandbox Code Playgroud)

如果你为你的检查设置一个略低于 1 分钟 (-w 59) 的 arping 截止日期,并调整睡眠量,那么你几乎可以保证两次测试和中间的睡眠将在你的 20 分钟内完成,因此不应与相邻时段重叠,也无需检查是否有其他脚本仍在运行。

当然,上述任一脚本都将通过每 20 分钟运行一次的静态 cron 条目调用:

*/20 * * * * /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)