ジョブスケジューリング(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 は失敗通知の仕組みを持たないため、ログ出力や通知の仕組みを自分で用意する必要があります。