1

定期的に実行される cron タスクがあります。このタスクは、その処理を完了するために有効である条件に依存します。重要な場合、この条件はデータベース内の特定のレコードに対する単なる SELECT です。条件が満たされない場合 (つまり、SELECT が予期した結果セットを返さない場合)、スクリプトはただちに終了します。
条件がすぐに有効になるため、これは悪いことです (いつになるかはわかりませんが、別のスクリプトの実行により有効になります)。
ですから、どうにかしてスクリプトをより堅牢にしたいと考えています。私は2つの解決策を考えました:

  1. whileループを入れてsleep、条件が有効になるまで継続します。これは機能するはずですが、スクリプトがループに入ると制御不能になるという欠点があります。そのため、特定のファイルが存在するかどうかを確認するために目を覚ました後に追加する必要があります。もしそうなら、それはユーザーがそれを「強制」したいことを「理解」します。
  2. スクリプトは、条件がまだ有効ではないことを確認すると、crontab にスクリプトを追加して停止します。その数秒のスクリプトは継続的に条件をポーリングし、条件が有効な場合は最初のスクリプトを再起動してその処理を再開します。この解決策は機能しているように見えますが、それが良い解決策であるかどうかはわかりません。たとえば、プログラムで crontab を変更するのは悪い考えでしょうか?

とにかく、おそらくこの問題は一般的であり、私が思いついた2つよりもはるかに優れた標準的な解決策があると思いました. 誰かがより良い提案を持っていますか? 私の考えからどれが一番いいでしょうか?私はcronタスクの経験があまりないので、私が監督できること/問題がある可能性があります.

4

2 に答える 2

1

プログラムで crontab を追加する代わりに、 を使用atして、将来のある時点でジョブを再度実行するようにスケジュールすることを検討することをお勧めします。スクリプトがそのジョブを今実行できないと判断した場合は、コマンドを使用して、数分後 (場合によっては数時間後) に再度実行するようにスケジュールすることができますat

于 2013-08-08T19:25:12.843 に答える
1

コメントでの会話からフォローアップすると、cron エントリで条件付き実行を利用できます。時刻に基づいて分岐したい場合は、 からの出力を使用できますdate

例: これは常に最初のコマンドを呼び出し、時計の時間が現在 11 の場合にのみ 2 番目のコマンドを呼び出します。

echo 'ScriptA running' ; [ $(date +%H) == 11 ] && echo 'ScriptB running'

もっと例を!

最初のコマンドからの戻り値を確認するには:

echo 'ScriptA' ; [ $? == 0 ] echo 'ScriptB'

代わりに STDOUT をチェックするには、as コロンを noop として使用し、で使用したのと同じ$()構成で出力をキャプチャして分岐できdateます。

: ; [ $(echo 'ScriptA') == 'ScriptA' ] && echo 'ScriptB'

最後の例の 1 つの欠点: 最初のコマンドの STDOUT がコンソールに出力されません。それが重要な場合は、それを変数にキャプチャするechoか、ファイルに書き込むことができますtee

于 2013-08-13T17:40:08.723 に答える