如何每天仅运行一次程序,同时考虑到可变的正常运行时间和可能的程序故障?

如何每天仅运行一次程序,同时考虑到可变的正常运行时间和可能的程序故障?

我需要运行命令一次,但每天只需运行一次,直到成功为止。

无法期望持续的正常运行时间,也无法保证计划成功。

该程序需要网络访问,但并非每次我启动计算机时都具有网络访问权限。

我的程序将以 -1 等退出,除非成功(返回 0 )。

答案1

使用 shell 来提供此功能。例如,创建一个类似于以下内容的脚本:

#!/bin/sh
# Check to see if this is already running from some other day
mkdir /tmp/lock || exit 1
while ! command-to-execute-until-succeed; do
    # Wait 30 seconds between successive runs of the command
    sleep 30
done
rmdir /tmp/lock

之后,将 cron 指向该脚本。

答案2

我认为最简单的方法是让您的程序在尝试之前检查文件是否存在,并在成功执行后创建该文件。

如果您无法修改程序来执行此操作,请使用 cronjob 本身。大致如下:

test -e /path/to/tempfile || ( /path/to/program && touch -a /path/to/tempfile )

由于 unix 评估条件检查的方式,一旦条件的左侧||评估为true,整个表达式为 true,并且右侧永远不会评估 - 即,不会调用该程序。

然后在括号内,&& 要求两边都计算为 true,因此如果/path/to/program以非零返回代码退出,则计算右侧的语句是没有意义的——表达式已经计算为 false——并且/path/to/tempfile永远不会被创建。

相关内容