我需要运行命令一次,但每天只需运行一次,直到成功为止。
无法期望持续的正常运行时间,也无法保证计划成功。
该程序需要网络访问,但并非每次我启动计算机时都具有网络访问权限。
我的程序将以 -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
永远不会被创建。