「毎朝バックアップを回す」「週一でログを整理する」——毎回手で叩くのはもう卒業しましょう。
本記事は cron(crond)と crontab の基本 を、失敗しやすいポイント(PATH・権限・ログ)まで押さえて最短で自動化できるようにまとめました。SEO想定キーワードは「cron 使い方」「シェル 自動実行」「crontab 設定」です。
こんな課題、cronで解決できます
- 手動実行のし忘れ・人的ミスが多い
- 退勤後や深夜にしか実行したくない処理がある
- 定期的なバックアップ/ログ整理/レポート生成を自動化したい
- 実行の成否や原因をログで追えるようにしたい
cron と crontab の関係(ざっくり理解)
- cron(crond): 裏で動くスケジューラ本体(デーモン)
- crontab: スケジュール(ジョブ)を登録・編集するための仕組み(ユーザーごとに持てる)
Linux では多くのディストリで systemd により crond が常駐 しています。止まっていると何も動きません。
まずは動作確認(1分)
- cron デーモンの状態を確認
- Debian/Ubuntu 系:
systemctl status cron - RHEL/CentOS/AlmaLinux 系:
systemctl status crond
- Debian/Ubuntu 系:
- ユーザーの crontab を開く
crontab -e初回はエディタ選択が出る場合あり(vim/nano など) - 1分ごとに現在時刻を追記するテスト(5分で消してOK)
* * * * * /bin/date >> /tmp/cron-test.log 2>&1数分後、/tmp/cron-test.logに時刻が増えていれば成功
crontab の書式(覚えるのはここだけ)
分 時 日 月 曜 コマンド
m h dom mon dow command
- 分: 0–59、時: 0–23、日: 1–31、月: 1–12、曜: 0–7(0 と 7 は日曜)
- 代表的な指定
*すべて*/55分ごと1,151日と15日1-5月~金(dow を 1-5)
例)毎日 3:00 に実行
0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
例)毎週月曜 7:00 に実行
0 7 * * 1 /path/to/script.sh >> /var/log/myjob.log 2>&1
シンプル指定(@記法)
@reboot /path/to/script.sh # 起動時
@daily /path/to/script.sh
@weekly /path/to/script.sh
@monthly /path/to/script.sh
安定稼働の3原則:PATH・権限・改行コード
1) PATH(コマンドの場所)問題
cron は 最小限の環境変数 で動くため、ターミナルで動くコマンドが cron だと見つからないことが多いです。
- フルパスで書く のが最短解(例:
/usr/bin/bash,/usr/bin/python3,/usr/bin/rsync) - もしくは冒頭で PATH を明示
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/bin/bash
2) 実行権限とシバン
- スクリプトは実行権限を付与:
chmod +x /path/to/script.sh - 先頭にシバン(推奨)
#!/usr/bin/env bash set -euo pipefail
3) 改行コード(CRLF問題)
- Windows 由来ファイルは CRLF で失敗します。LF(Unix) に統一(
dos2unixで変換可)
ログを残して原因追跡をラクに
標準出力・標準エラーを両方保存
0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
日次ローテーションしたいなら logrotate を併用(/etc/logrotate.d/ に設定)
大きなログが溜まっても自動で圧縮・古いもの削除が可能です。
多重起動の事故を防ぐ(基本の保険)
長時間処理が重なって 二重実行 すると破壊的。flock で排他します。
0 * * * * /usr/bin/flock -n /tmp/myjob.lock /path/to/script.sh >> /var/log/myjob.log 2>&1
-nはロック待ちしない(すでに実行中なら即スキップ)
よく使うレシピ(コピペ用)
平日のみ 19:30 に実行(メンテ/集計)
30 19 * * 1-5 /path/to/script.sh >> /var/log/workday.log 2>&1
毎時 15分に実行(短時間ジョブ)
15 * * * * /path/to/job.sh >> /var/log/hourly.log 2>&1
5分ごと
*/5 * * * * /path/to/ping.sh >> /var/log/ping.log 2>&1
@reboot(再起動時のウォームアップ)
@reboot /path/to/warmup.sh >> /var/log/warmup.log 2>&1
ユーザー別に実行したい(Web/DBユーザーなど)
- 自分の crontab:
crontab -e - 別ユーザーの crontab 編集(root で):
sudo crontab -u www-data -e - サービス権限で動かすと ファイル権限・環境差 による不具合が減ります
「動かない」あるあるチェックリスト
systemctl status cron/crondは active か- スクリプトに 実行権限 と シバン があるか
- フルパス を使っているか(コマンド・スクリプト・ファイル)
- 改行コード は LF か
- 相対パス を使ってないか(
cdが前提になっていないか) - 外部サービス/API 依存時、ネットワーク可達性 を確認しているか
- cron のログを確認(例:Debian/Ubuntu)
grep CRON /var/log/syslogRHEL系はjournalctl -u crond
設計テンプレ(そのままメモにどうぞ)
- 目的:何をどの頻度で、いつまでに終えたいか
- 頻度:毎日 / 毎週〇曜 / 平日 / 5分ごと など
- 排他:
flockで多重起動防止 - ログ:出力先、ローテーション
- 失敗時:通知(メール/Slack/Teams などは後日拡張)
- 実行ユーザー:root / www-data / appuser どれが妥当?
- セキュリティ:権限(600/700)、秘密情報の扱い、置き場所
まとめ
- crontab の基本書式と @記法 を覚えれば、日次・週次の定期処理は即自動化できます
- PATH・権限・改行 の3点を最初に固めると「動かない」を激減できます
- ログ保存+flock をセットにしておけば、原因追跡と事故予防まで一気にカバー
この土台さえ作れば、「通知連携」「リトライ設計」「依存関係管理」などの発展にもスムーズに進めます。まずは小さなジョブから、今日卒業しましょう。

コメント