ジョブスケジューリング(cron)
ジョブスケジューリングとは
ジョブスケジューリングは、決まった時刻や間隔でプログラムを自動実行する仕組みです。「毎晩2時に集計する」「5分おきに死活確認する」といった [[バッチ処理]] や定期タスクの起動役を担います。
その代表が [[Linux]] に古くからある cron(クーロン)です。crontab というファイルに「いつ・何を実行するか」を書いておくと、指定どおりにコマンドが実行されます。
cron書式の読み方
cron の設定は5つのフィールド+コマンドで書きます。左から「分・時・日・月・曜日」です。
# 分 時 日 月 曜日 コマンド
0 2 * * * /opt/app/daily-report.sh # 毎日 2:00
*/5 * * * * /opt/app/healthcheck.sh # 5分おき
30 9 * * 1 /opt/app/weekly.sh # 毎週月曜 9:30
*は「毎回」、*/5は「5ごと」、数値はその値ちょうどを意味します- 実行するユーザーごとに
crontab -eで編集し、crontab -lで確認します
この書式は cron 以外のツール(CI/CD の定期実行、クラウドのスケジューラなど)でも広く採用されており、読めるだけで役立つ共通言語です。
cronの弱点と現代の選択肢
シンプルで頼れる cron ですが、素朴ゆえの弱点があります。
| 弱点 | 内容 |
|---|---|
| 失敗に気づけない | 実行に失敗しても標準では通知がない |
| 多重起動 | 前回の実行が終わる前に次が始まってしまうことがある |
| 1台前提 | サーバーが複数あると「どの1台で動かすか」の管理が必要 |
このため現代では、[[systemdとサービス管理]] の timer(ログ管理と統合されている)、クラウドのマネージドスケジューラ(Amazon EventBridge など)、ジョブ管理ツール(Airflow など)が用途に応じて使われます。ただし土台の考え方は cron と同じです。
初学者向けポイント
- cron から実行されるときは環境変数が対話シェルと異なります(PATH が最小限など)。「手で実行すると動くのに cron だと動かない」原因の大半はこれです — スクリプト内で絶対パスを使いましょう
- 出力をログファイルにリダイレクトし([[シェルとコマンドライン]] の
>>を活用)、実行結果を後から確認できるようにするのが基本です - 失敗検知は自分で仕込む必要があります。まずは「失敗したら通知する」ラッパースクリプトから始めましょう
関連技術とのつながり
- [[バッチ処理]] — スケジューラが起動する中身の代表がバッチ
- [[Linux]] — cron は Linux 標準のスケジューラ
- [[シェルとコマンドライン]] — cron が実行するのはシェルコマンドそのもの
- [[systemdとサービス管理]] — timer ユニットは cron の現代的な代替
Q: cronの設定「0 2 * * *」が意味する実行タイミングはどれ?
- [ ] 2分おき
- [x] 毎日2時0分
- [ ] 毎月2日の0時
解説: フィールドは左から「分・時・日・月・曜日」なので、分=0・時=2・残りが毎回、つまり毎日2:00です。
Q: 「手で実行すると動くのにcronからだと動かない」主な原因はどれ?
- [x] cron実行時の環境変数(PATHなど)が対話シェルと異なるから
- [ ] cronは夜間しかコマンドを実行できないから
- [ ] cronはシェルスクリプトを実行できないから
解説: cron の実行環境は PATH が最小限などの違いがあるため、絶対パスの使用が基本対策です。
Q: 素朴なcronの弱点として本文で挙げられているのはどれ?
- [ ] 秒単位より細かいスケジュールしか書けない
- [ ] 実行できるコマンドが1つに制限される
- [x] 実行に失敗しても標準では通知がない
解説: cron は失敗通知の仕組みを持たないため、ログ出力や通知の仕組みを自分で用意する必要があります。