bash脚本中的条件crontab命令

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

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

最佳答案
将用于测试条件的逻辑代码放在脚本本身中,不要尝试将其放入(或与之关联)cron – 复杂逻辑不是cron的设计目的.

因此,在脚本中测试条件,如果评估为true,则运行处理代码.如果它的计算结果为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

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

第二个(#2)是您的初始’is host pingable’测试.如果不是,则脚本在再次测试之前等待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

转载注明原文:bash脚本中的条件crontab命令 - 代码日志