/etc/cron.d と anacron
『/etc/cron.d』・『/etc/cron.daily』などのシステム cron ディレクトリは、パッケージやシステム管理者がジョブを追加するための仕組みです。ユーザーごとの crontab とは独立しており、複数のファイルに分散してジョブを管理できます。また『anacron』は、電源オフ中などに実行されなかった定期タスクを次回起動時に補完して実行するデーモンです。サーバーではなく常時稼働していないマシンでの定期バックアップ等に特に有用です。
構文
# ----------------------------------------------- # /etc/cron.d/ のジョブファイル形式 # ----------------------------------------------- # 書式: 分 時 日 月 曜日 実行ユーザー コマンド # ユーザー列が必須な点がユーザー crontab と異なります # 分(0-59) 時(0-23) 日(1-31) 月(1-12) 曜日(0-7, 0と7は日曜) ユーザー コマンド 0 2 * * * root /usr/local/bin/cleanup.sh # ----------------------------------------------- # /etc/cron.daily/ 等のディレクトリ形式 # ----------------------------------------------- # ディレクトリ内に実行可能スクリプトを配置するだけでジョブが登録されます # ファイル名にドット(.)やチルダ(~)を含めると実行されないので注意してください # 実行タイミングは /etc/crontab または /etc/anacrontab が制御します # ----------------------------------------------- # /etc/anacrontab の形式 # ----------------------------------------------- # 書式: 周期(日数) 遅延(分) ジョブID コマンド # SHELL や PATH 等の環境変数も設定できます SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 周期(日数) 遅延(分) ジョブID コマンド 1 5 cron.daily run-parts --report /etc/cron.daily 7 10 cron.weekly run-parts --report /etc/cron.weekly @monthly 15 cron.monthly run-parts --report /etc/cron.monthly
構文一覧
| ディレクトリ/ファイル | 説明 |
|---|---|
/etc/cron.d/ | パッケージやシステム管理者がジョブファイルを配置するディレクトリです。ファイルごとにジョブをまとめられるため管理しやすくなります。ユーザー列の記述が必須です。 |
/etc/cron.daily/ | 毎日1回実行したいスクリプトを配置するディレクトリです。ファイルに実行権限を付与するだけで登録完了です。 |
/etc/cron.weekly/ | 毎週1回実行したいスクリプトを配置するディレクトリです。実行タイミングは『/etc/anacrontab』で制御されます。 |
/etc/cron.monthly/ | 毎月1回実行したいスクリプトを配置するディレクトリです。 |
/etc/crontab | システム全体の cron 設定ファイルです。ユーザー crontab と異なりユーザー列が必要です。直接編集して使うこともできますが、『/etc/cron.d/』への分割管理が推奨されます。 |
/etc/anacrontab | anacron の設定ファイルです。「周期(日数)」「遅延(分)」「ジョブID」「コマンド」の4列で定義します。電源オフ中に実行されなかったジョブを次回起動時に補完します。 |
anacron | システム起動時に『/etc/anacrontab』を読み込み、最終実行日から指定日数が経過しているジョブを実行するデーモンです。常時稼働でないマシンに適しています。 |
run-parts | 指定ディレクトリ内の実行可能ファイルをまとめて実行するコマンドです。『/etc/cron.daily/』等の実行に使われます。 |
/var/spool/anacron/ | anacron が最終実行日を記録するディレクトリです。このタイムスタンプを基に補完実行が必要かどうかを判断します。 |
使用例
/etc/cron.d/shimotsuki-backup
# ----------------------------------------------- # /etc/cron.d/ にシステムジョブを登録する例 # 霜月美佳のホームディレクトリを毎日深夜2時にバックアップします # ----------------------------------------------- # 環境変数を設定します(省略時は最小限の環境が使われます) SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # ジョブの形式: 分 時 日 月 曜日 実行ユーザー コマンド # 毎日 02:00 に root 権限でバックアップスクリプトを実行します 0 2 * * * root /usr/local/bin/shimotsuki-backup.sh >> /var/log/shimotsuki-backup.log 2>&1 # 毎週月曜 03:00 に差分バックアップの整合性チェックを実行します 0 3 * * 1 root /usr/local/bin/backup-verify.sh
実行するコマンドは次の通りです。
$ sudo chmod 644 /etc/cron.d/shimotsuki-backup $ ls -l /etc/cron.d/ total 24 -rw-r--r-- 1 root root 88 Mar 25 09:00 .placeholder -rw-r--r-- 1 root root 312 Mar 25 09:01 shimotsuki-backup -rw-r--r-- 1 root root 102 Mar 10 00:00 sysstat
/etc/cron.daily/kogami-logrotate
#!/bin/bash
# -----------------------------------------------
# /etc/cron.daily/ に配置するスクリプト例
# 狡噛慎也のログファイルを毎日ローテーションします
# -----------------------------------------------
LOG_DIR="/var/log/kogami-monitor"
KEEP_DAYS=30
# 30日以上古いログファイルを削除します
find "${LOG_DIR}" -name "*.log" -mtime +${KEEP_DAYS} -delete
# 今日のログファイルを圧縮して保存します
ARCHIVE="${LOG_DIR}/archive-$(date +%Y%m%d).tar.gz"
find "${LOG_DIR}" -maxdepth 1 -name "*.log" -exec tar -czf "${ARCHIVE}" {} +
echo "ログローテーション完了: ${ARCHIVE}"
実行するコマンドは次の通りです。
$ sudo chmod +x /etc/cron.daily/kogami-logrotate $ sudo run-parts --test /etc/cron.daily/ /etc/cron.daily/apt-compat /etc/cron.daily/kogami-logrotate /etc/cron.daily/logrotate /etc/cron.daily/man-db
/etc/anacrontab
# ----------------------------------------------- # anacron の設定ファイル例 # 電源オフ中に実行されなかったジョブを補完します # ----------------------------------------------- SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # MAILTO に宛先を設定するとジョブの実行結果がメール通知されます MAILTO=ginoza@psycho-pass.example # 書式: 周期(日数) 遅延(分) ジョブID コマンド # 毎日のジョブ(起動5分後に実行します) 1 5 cron.daily run-parts --report /etc/cron.daily # 毎週のジョブ(起動10分後に実行します) 7 10 cron.weekly run-parts --report /etc/cron.weekly # 毎月のジョブ(起動15分後に実行します) @monthly 15 cron.monthly run-parts --report /etc/cron.monthly # ----------------------------------------------- # 宜野座伸元のシステム健全性チェック(3日ごと) # 最後の実行から3日以上経過していれば補完実行されます # ----------------------------------------------- 3 20 ginoza-healthcheck /usr/local/bin/ginoza-healthcheck.sh
実行するコマンドは次の通りです。
$ sudo anacron -T $ echo $? 0 $ cat /var/spool/anacron/cron.daily 20260324
コマンド例(anacron の手動実行と状態確認)
# ----------------------------------------------- # anacron の動作確認・手動実行 # ----------------------------------------------- # anacron の設定ファイルの構文チェックを行います(エラーがなければ終了コード0) sudo anacron -T # 実行が保留されているジョブをすべて今すぐ実行します(テスト用途) sudo anacron -f -d # 最終実行日のタイムスタンプを確認します cat /var/spool/anacron/cron.daily cat /var/spool/anacron/cron.weekly # systemd 環境での anacron ユニット状態確認(Debian/Ubuntu 系) systemctl status anacron.service # /etc/cron.daily/ 内のスクリプトを手動でテスト実行します sudo run-parts --verbose /etc/cron.daily/
実行するコマンドは次の通りです。
$ sudo anacron -f -d Anacron 2.3: invoked on 2026-03-25 Will run job `cron.daily' in 5 min. Will run job `ginoza-healthcheck' in 20 min. Jobs will be executed sequentially
概要
システム cron のジョブ管理には、『/etc/crontab』への直接記述よりも『/etc/cron.d/』へのファイル分割が推奨されます。パッケージがインストール時に自動でジョブを登録できるほか、ジョブごとにファイルを分けて管理できるため、変更履歴の追跡がしやすくなります。『/etc/cron.daily/』等のディレクトリはさらに簡単で、実行可能スクリプトを配置するだけで登録完了です。ただしファイル名にドット(『.』)やチルダ(『~』)が含まれると『run-parts』に無視されるため注意してください。
anacron は「最後に実行された日付」を『/var/spool/anacron/』に記録しており、次回起動時にその日数が経過していればジョブを補完実行します。これにより、深夜にシャットダウンしているノート PC やデスクトップ機でも定期バックアップを確実に実行できます。個々のユーザーによるタスクのスケジューリングは crontab のページを、より細かいスケジュール制御や依存関係の管理には systemd timer も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。