【问题标题】:I want to make a conditional cronjob我想做一个有条件的cronjob
【发布时间】:2010-10-13 21:34:28
【问题描述】:

我有一个每小时运行的 cron 作业。它访问一个 xml 提要。如果 xml 提要不可用(这似乎每天发生一次),它会创建一个“失败”文件。这个“失败”文件中包含一些元数据,并在下一小时脚本再次运行并且 XML 提要再次工作时被删除。

我想要的是在第一个 cron 作业后几分钟运行第二个 cron 作业,查看目录中的“失败”文件,如果存在,重试第一个 cron 作业。

我知道如何设置 cron 作业,但我只是不知道如何使脚本像那样有条件。我是否以完全错误的方式处理这个问题?

【问题讨论】:

    标签: bash unix scripting cron


    【解决方案1】:

    可能。也许您最好让原始脚本休眠并重试(有限)次。

    Sleep 是一个 shell 命令,shell 支持循环,所以它看起来像:

    for ((retry=0;retry<12;retry++)); do
        try the thing
        if [[ -e my_xlm_file ]]; then break; fi
        sleep 300 
        # five minutes later...
        done
    

    【讨论】:

      【解决方案2】:

      作为要运行的命令,试试:

      /bin/bash -c 'test -e failurefile && retrycommand -someflag -etc'
      

      如果失败文件存在则运行重试命令

      【讨论】:

      • 我认为这回答了 OP 提出的问题 +1
      • 将所有内容都包装在 /bin/bash -c 中似乎很愚蠢,因为 cron 支持 SHELL 变量。
      【解决方案3】:

      为什么不让您的脚本在成功完成后触摸状态文件。让它每 5 分钟运行一次,并让脚本的第一次检查是查看状态文件是否小于 60 分钟,如果它是年轻的,则退出,如果它是旧的,则获取。

      【讨论】:

      • 在某些环境中,“作业”每小时都会略有变化(例如,提取带时间戳的转储),因此这可能会变得复杂。
      【解决方案4】:

      我同意 MarkusQ 的观点,即您应该重试原始作业,而不是创建另一个作业来观看第一个作业。

      看看这个工具,让重试更容易:https://github.com/kadwanev/retry

      您可以非常轻松地将原始 cron 包装在重试中,并且失败文件的最终存在将指示它是否在重试之后失败。

      【讨论】:

        【解决方案5】:

        如果有人需要 bash 脚本来 ping 端点(例如,通过 cron 运行计划的 API 任务),请重试,如果响应状态不佳,则:

        #!/bin/bash
        echo "Start pinch.sh script.";
        # run 5 times
        for ((i=1;i<=5;i++))
        do
            # run curl to do a POST request to https://www.google.com
            # silently flush all its output
            # get the response status code as a bash variable
            http_response=$(curl -o /dev/null -s -w "%{response_code}" https://www.google.com);
            # check for the expected code
            if [ $http_response != "200" ]
            then
                # process fail
                echo "The pinch is Failed. Sleeping for 5 minutes."
                # wait for 300 seconds, then start another iteration
                sleep 300
            else
                # exit from the cycle
                echo "The pinch is OK. Finishing."
                break;
            fi
        done
        exit 0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多