Cron は、対話型シェルを使わずに、繰り返しスケジュールでコマンドを実行します。自動化すると、正しい動作だけでなく間違いも繰り返されます。スケジュールへ登録する前に、コマンドをテストし、明示的なパスを使い、権限を必要最小限に抑え、ログ記録と失敗通知を計画してください。
プロセス利用率 · レッスン 8
Cron ジョブ
cron を使って定期ジョブを作成、確認、テストし、安全に運用する方法を学びます。
crontab のエントリーを読む
ユーザーの crontab エントリーは、5つの時刻フィールドと、その後に続くコマンドで構成されます。
30 8 * * * /home/pete/scripts/change_wallpaper
フィールドは左から、分、時、日、月、曜日です。この例は、cron デーモンに適用されるタイムゾーンで毎日 08:30 に実行されます。アスタリスクは、そのフィールドで許されるすべての値を意味します。
日と曜日の両方を制限した場合、多くの cron 実装はどちらか一方が一致すると実行します。両方を使うスケジュールを作る前に、ローカル環境の動作を確認してください。
30 8 * * * command はいつ実行されますか?
ユーザーの crontab を管理する
現在のユーザーの crontab を編集するには、次を実行します。
$ crontab -e
変更の前後に、インストール済みのエントリーを一覧表示します。
$ crontab -l
crontab -r はユーザーの crontab 全体を削除し、エディターを開かずに実行される場合があります。1行だけを削除するために使わず、crontab を編集して残りのエントリーを確認してください。
現在のユーザーにインストールされている cron エントリーを一覧表示するコマンドはどれですか?
Cron の実行環境を考慮する
Cron が提供する環境は限定的で、非対話型シェルを使うのが一般的です。コマンドとファイルには絶対パスを使い、必要な変数を明示的に設定し、エイリアス、現在の端末の作業ディレクトリ、シェルの起動ファイルに依存しないようにします。
標準出力と標準エラーを管理されたログへリダイレクトするか、そのシステムに適した通知方法を使います。認証情報は厳しい権限で保護し、crontab のコマンドへ秘密情報を直接埋め込まないでください。
cron コマンドで明示的なパスと環境設定を使うべきなのはなぜですか?
テストと重複実行の防止
同じユーザーとして、同様に限定した環境でスクリプトを手動実行します。役に立つ終了ステータスを返し、時刻付きの結果を記録するようにしてください。登録後は、安全なテストスケジュールまたは制御された実行を待ち、実際の副作用とログを確認します。
1回の実行が次の実行間隔より長くなる可能性がある場合は、並行実行に対応するよう設計するか、利用できる環境では flock などのロック機構を使います。
*/5 * * * * /usr/bin/flock -n /run/user/1000/report.lock /home/pete/bin/report
ジョブのユーザーが安全に作成できるロックパスを選び、実行がスキップされてもよいかを決めてください。Cron は自動的に1インスタンスだけの実行を保証しません。
ジョブの実行時間がスケジュール間隔より長い場合、どのような危険がありますか?
適切なスケジューラーを選ぶ
Cron は単純な定期コマンドに適しています。systemd ホストでは、systemd タイマーにより依存関係との統合、停止中に逃した実行の補完、ランダムな遅延、ジャーナルへのログ記録を利用できます。複数のマシンにまたがってジョブを厳密に1回だけ実行する必要がある場合は、アプリケーションまたはクラスタ用スケジューラーの方が安全なことがあります。
ホストごとに動く通常の cron が、クラスタ全体で厳密に1回だけ実行するジョブに適さない場合があるのはなぜですか?
レッスン完了
Cron ジョブ を完了しました
スケジュールと実行環境の前提を明示して、定期 cron ジョブを運用できるようになりました。
5つの時刻フィールドを定義された順序で読む。
無関係なジョブを削除せず、ユーザーの crontab を確認、編集する。
パス、環境、ログ、認証情報の扱いを定義する。
ジョブのユーザーとしてテストし、意図しない重複実行を防ぐ。
ホストと協調要件に合うスケジューラーを選ぶ。