稼働時間の変動やプログラムの障害の可能性を考慮しながら、プログラムを 1 日に 1 回だけ実行するにはどうすればよいですか?

稼働時間の変動やプログラムの障害の可能性を考慮しながら、プログラムを 1 日に 1 回だけ実行するにはどうすればよいですか?

コマンドを 1 回実行する必要がありますが、成功するまで 1 日に 1 回だけです。

継続的な稼働は期待できず、プログラムの成功は保証されません。

このプログラムにはネットワーク アクセスが必要ですが、コンピューターを起動するたびにネットワーク アクセスが必要になるわけではありません。

私のプログラムは、成功しない限り (つまり 0 を返す場合)、たとえば -1 で終了します。

答え1

これを実現するにはシェルを使用します。たとえば、次のようなスクリプトを作成します。

#!/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作成されません。

関連情報