【くろんじょぶ】

cronジョブ とは?

最終更新:
💡 「毎日3時にバックアップ」のような定期作業を自動で動かす仕組み

Unix系OSのcronに登録して、決まった日時や間隔で自動実行するコマンドやスクリプト。バックアップや集計処理の自動化に使われる。

📌 このページのポイント
5つの時刻欄と、実行するコマンド 30 分 30分 9 時 9時 * 日 毎日 * 月 毎月 1-5 曜日 月〜金 /usr/local/bin/backup.sh 月〜金の9:30に実行(祝日も含む) 時刻の基準は実行環境の設定で確認 ユーザーのcrontabの記述例
30 9 * * 1-5 /usr/local/bin/backup.sh の例。祝日を除外する条件は含まれていない。
ひよこ ひよこ
ペンギン先生、crontabってどう書くの?
ペンギン先生 ペンギン先生
「分 時 日 月 曜日 コマンド」の順に書くよ。「0 3 * * * /usr/local/bin/backup.sh」なら毎日3時0分にバックアップを実行、「0 9 * * 1」なら毎週月曜9時だね。*は「すべて」の意味だよ。crontab -eで編集、crontab -lで一覧を確認できるんだ。
ひよこ ひよこ
「5分ごと」はどう書くの?
ペンギン先生 ペンギン先生
「*/5 * * * *」と書くよ。/nは「範囲の中でn刻み」という指定だね。ただしPOSIXの標準にはない拡張で、多くのcron実装が対応している書き方なんだ。刻みはそのフィールドの中だけで数えるから、分に*/35と書くと「35分ごと」ではなく、毎時0分と35分になるよ。
ひよこ ひよこ
手で打つと動くのに、cronだと動かないことがあるって本当?
ペンギン先生 ペンギン先生
本当だよ。cronはログイン時とは別の、最小限の環境変数で動く。SHELLは/bin/shが既定で、PATHなども普段の端末とは違う値になるんだ。コマンドは絶対パスで書くか、crontabの先頭でPATHを設定しよう。出力はメールで送られる仕組みだから、リダイレクトでログファイルに残すと原因を追いやすいよ。
ひよこ ひよこ
時刻がずれて動くこともあるの?
ペンギン先生 ペンギン先生
あるよ。時刻の基準は、cronを動かしているサーバー側の設定だよ。サーバーがUTCなら、日本時間とは9時間ずれるね。cronieのように、CRON_TZでタイムゾーンを指定できる実装もある。GitHub ActionsのscheduleはUTCが既定で、最短5分間隔、混雑時は遅れることもあるよ。
ひよこ ひよこ
cronの代わりになる仕組みはある?
ペンギン先生 ペンギン先生
Linuxならsystemdのtimerユニットが使えるよ。Persistent=trueにすると、電源が切れていて逃した実行を、起動後にまとめて1回行えるんだ。KubernetesにはCronJobリソースがあって、AWSのEventBridge SchedulerやGoogle CloudのCloud Schedulerもcron形式でスケジュールを書ける。依存関係の多い処理なら、ワークフローエンジンを検討しよう。
もっと詳しく知りたい人へ

date +%Y%m%d を含むコマンドが、cronだと途中で切れてしまうのはなぜ?

crontabのコマンド欄では、%が改行として扱われるからだよ。最初の%より後ろは、コマンドの標準入力として渡されてしまう。date +\%Y\%m\%d のように%の前にバックスラッシュを付けるか、処理をスクリプトファイルにまとめて、そのファイルを呼び出そう。

「日」と「曜日」を両方指定すると、両方に当てはまる日だけ動くの?

POSIXの仕様では逆で、どちらかに当てはまれば動くよ。たとえば「30 4 1,15 * 5」は、毎月1日と15日の4時30分に加えて、毎週金曜日の4時30分にも実行される。「13日の金曜日だけ」のような条件は、スクリプトの中で曜日を確認しよう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「cronジョブ」って出てきたら「決まった時刻に自動で実行される作業」と思えればだいたいOK!
📖 おまけ:英語の意味
「Cron Job」 = cronが実行するジョブ(仕事)
💬 cronというスケジューラーが実行する「ジョブ(仕事)」という意味だよ。予定はcrontab(cron table)という表に書くんだ

参考資料

← 用語集にもどる