cronの仕組み — 毎朝7時にレポートを作る予約を読む
予約係が起動し、スクリプトがレポートを作る
- 身近な例で仕組みを説明できる
- 例の入力と結果を比べ、成立条件を確認する
まずは、予約する前にレポートを1回作る
cronは、コマンドを時刻に合わせて起動する仕組みです。Linuxなどの練習用環境で、cronが導入されサービスが動いていることを確認してから使います。Windowsのタスクスケジューラーとは別の道具です。
まずは新しい練習用フォルダーにreport.pyを保存してください。Python 3で、自分のフォルダー内だけへ結果を書きます。
from datetime import datetime
from pathlib import Path
report = Path(__file__).with_name(
'report.txt'
)
now = datetime.now().astimezone()
time_text = now.isoformat(timespec='seconds')
message = 'レポート作成完了: ' + time_text
report.write_text(
message + '\n', encoding='utf-8'
)
print('created:', report)
そのフォルダーでpython3 report.pyを実行します。report.txtができ、時刻とタイムゾーン付きのメッセージが入れば、まず1回は動かせています。この例は実行ごとに自分のreport.txtを上書きします。実際の集計データを作る処理ではありません。
予約の1行を分解する
次はユーザー個別のcrontabの例です。crontab -lで今の内容を確認し、crontab -eで編集します。既存の予約を消さず、実行ファイルとフォルダーの場所を先に調べてください。
0 7 * * * /usr/bin/python3 /home/hiyoko/cron-lab/report.py >> /home/hiyoko/cron-lab/report.log 2>&1
/usr/bin/python3と/home/hiyoko/cron-lab/は例のパスです。自分のLinux環境でcommand -v python3とpwdを実行し、確認した場所へ置き換えます。スペースのあるパスはシェルの引用にも注意してください。上の例では、作業場所に頼らずreport.pyと同じ場所へ結果を保存するようにしています。
| 項目 | 値 | 意味 |
|---|---|---|
| 分 | 0 | 0分 |
| 時 | 7 | 7時 |
| 日 | * | すべての日 |
| 月 | * | すべての月 |
| 曜日 | * | すべての曜日 |
>>はログへの追記、2>&1はエラー出力も同じ行き先へ送る指定です。予約したあとには、次の3点を別々に確かめましょう。
- 予約が残っていて、cronが動いているか。
report.logに実行の出力やエラーが残っているか。report.txtの内容が、今回の実行で更新されたか。
cronの起動記録だけを見て「完成した」と判断しないことが大切です。ログも増え続けるので、保管と削除の方針を決めます。
もう少し詳しく:条件の落とし穴
0 7 1 * 1は、日と曜日の両方を制限しています。一般的なcrontabでは、毎月1日、または月曜日の7時に実行します。「1日かつ月曜日だけ」という意味ではありません。
*/15を分へ指定すると、0・15・30・45分に合います。「前回終了から15分後」ではなく、分のフィールドに合う時刻です。シェルに渡る部分の%は、通常のコマンド実行と違う扱いになる実装もあるため、複雑な処理は別スクリプトに分けて確認しましょう。
cronも通常は/bin/shなどのシェル経由でコマンドを実行します。ただし普段使う対話シェルと環境変数、初期化ファイル、権限が同じとは限りません。ユーザーのcrontabと、ユーザー名の欄を持つシステム用crontabも区別してください。
取り逃し・重複・時刻も設計する
処理が長引けば、次の予約が前の実行と重なる場合があります。ロックで起動を見送るのか、待たせるのか、重複しても同じ結果になるようにするのかを、業務に合わせて決めます。複数マシンに同じ予約を登録した場合は、1台のファイルロックだけでは解決しません。
停止中の実行を補う必要がある場合は、それに対応するスケジューラーや、処理済みの期間を記録する方法を検討します。クラウドの仕組みを使っても、対象処理の失敗や重複をどう扱うかは残ります。
タイムゾーンと夏時間の扱いは、利用するcronの実装・設定で確認してください。CRON_TZなどの拡張が使えるかも環境によります。UTCで統一するか、現地の営業時間に合わせるかは目的で決めます。
覚え方と次の一歩
「cron」って出てきたら「時刻に合わせてコマンドを起動する予約係」と思えばだいたいOK!
ファイル操作から確認するならLinux入門、実行結果を追うならログ収集の仕組みへ進めます。
参考資料
- Cronie:crontab(5) — 5項目の構文、実行シェル、日と曜日のOR条件、時刻と拡張
- Cronie:cron(8) — デーモンの動作と時刻の扱い