RPiプロジェクトでいくつかのコマンドをスケジュールするcrontabがあり、これらのコマンドがフラグの状態を切り替えるとします。ボックスの電源が切れて再起動することがあります。ボックスが引き続き機能する場合は、フラグの状態が正しい状態になることを願っています。
私の考え:
再起動時に作業があります。
- 最後に知られている週の日付を復元します(簡単です。ログエントリをファイルに保存でき、ファイルの日付は「最後に知られている週の日付」として指定されます)。
- 有効期限中に発生したイベントのリストを取得し、それを使用して新しい状態を計算するようにcrontabに要求します。
- 完了しました。いつものように作業してください:)
よりスマートな方法があるかどうか教えてください。そうでなければ、ポイント2をどのように達成できますか?
答え1
cron
イベントリストは提供されません。できることは、スクリプトを定期的に実行することです。スクリプトに次のことを行います。
- 構成ファイルの日付タイムスタンプをvar Xとして読み込みます。
- 所定のイベント間隔(60分など)だけXを増加させます。
- X < 現在の日時は残りのスクリプトを実行し、X を設定ファイルに書き込んで 2 を繰り返します。
- (ループで最小限の時間を待つ必要があるかもしれません)
これにより、コンピュータの実行中にエラーが発生しても、スクリプトは必要に応じてフラグを切り替えます。日付タイムスタンプファイルが間隔よりも古い場合、スクリプトは何もしないため、実行されるよりもはるかに頻繁にcronジョブから呼び出すことができます。これにより、再起動後の追いつきは、平均して間隔の半分後に発生する必要がなくなります。 (たとえば、5分ごとに実行するようにスクリプトをスケジュールします。)スクリプトが2回実行されるのを防ぐには、ロックを使用する必要があります(停電後に1つのスクリプトがそれを追いかけようとする場合)。
答え2
不揮発性リポジトリに状態を記録/var/tmp/status_task_x
し、次の実行時に同じファイルから最後に設定された状態を読み取るのはどうですか?この場合、再起動後も維持する必要があります。
crontabの例では:
* * * * * status_task_x=$(<"/var/tmp/status_task_x") /path/to/run_task_x $status_task_x
ジョブスクリプトに出力を次に書き込むようにします。/var/tmp/status_task_x
答え3
明らかに、これはすぐに利用可能な作業ではありません。 Pythonでライブラリを見つけました。 https://pypi.python.org/pypi/python-crontab 個々のタスクの「スケジュール」を見つけることができます。
schedule = job.schedule(date_from=datetime.now())
...
datetime = schedule.get_next()
これがまさに必要なものです。最後に再起動した日付から始まりますdate_from
が、datetime
今よりも短いサイクルです。