可変時間と可能なプログラムエラーを考慮して、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決して生成されませんでした。

関連情報