この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:T
更新日時:2026-06-11 07:12:00

タイトル: cronの導入と実行方法 (CentOS 7編)
SEOタイトル: CentOS 7 cron 導入と設定完全ガイド (crontab / cron.d / SELinux)

この記事の要点
  • インストール: sudo yum install -y cronie (CentOS 7 標準で導入済が多い)
  • 起動・自動起動: systemctl start crond && systemctl enable crond
  • 編集: crontab -e (ユーザー単位) / /etc/crontab / /etc/cron.d/* (root)
  • 書式: 分 時 日 月 曜日 コマンド の 5 フィールド + 実行コマンド
  • ログ: /var/log/cron、出力は >> /path/log 2>&1 で別ファイルへ

cron とは

cron は Unix 系 OS で指定時刻にコマンドを定期実行するための仕組みです。CentOS 7 では cronie パッケージが標準実装で、デーモンは crond、設定編集は crontab コマンドで行います。バックアップ、ログローテーション、定期バッチ、Let's Encrypt 自動更新など、ほぼ全 Linux サーバで稼働しています。

1. インストールと起動

# パッケージ確認・インストール (通常は導入済)
rpm -qa | grep cronie
sudo yum install -y cronie

# サービス起動・自動起動
sudo systemctl start crond
sudo systemctl enable crond

# 状態確認
sudo systemctl status crond
# Active: active (running) since ...

2. crontab の編集

# 現在のユーザー用 crontab を編集 (vi で開く)
crontab -e

# 一覧表示
crontab -l

# 全削除
crontab -r

# 別ユーザー用 (root のみ)
sudo crontab -u username -e
sudo crontab -u username -l

# EDITOR を変更したい場合
export EDITOR=nano
crontab -e

編集内容は /var/spool/cron/<username> に保存されますが、直接編集禁止。必ず crontab -e 経由で。

3. 書式 (5 フィールド + コマンド)

# 分 時 日 月 曜日 コマンド
#
# 分      : 0-59
# 時      : 0-23
# 日      : 1-31
# 月      : 1-12 (or jan-dec)
# 曜日    : 0-7  (0 と 7 は日曜、1=月, 2=火, ... 6=土) (or sun-sat)
# コマンド: 実行するコマンド
#
# 特殊文字:
#   *  全部
#   ,  複数列挙
#   -  範囲
#   /  間隔
#
# 例:
0 3 * * *        /usr/local/bin/backup.sh         # 毎日 3:00
*/15 * * * *     /usr/local/bin/poll.sh           # 15 分おき
0 0 * * 0        /usr/local/bin/weekly.sh         # 毎週日曜 0:00
0 9-18 * * 1-5   /usr/local/bin/business.sh       # 平日 9-18 時の毎時 0 分
0 0 1 * *        /usr/local/bin/monthly.sh        # 毎月 1 日 0:00
30 2 * * *       /usr/local/bin/maintenance.sh    # 毎日 2:30

# 特殊な単語
@reboot          /usr/local/bin/startup.sh        # 起動時 1 回
@hourly          (= 0 * * * *)
@daily           (= 0 0 * * *)
@weekly          (= 0 0 * * 0)
@monthly         (= 0 0 1 * *)
@yearly          (= 0 0 1 1 *)

4. ログ出力とエラー抑制

cron 自体のログ

# cron の実行履歴
sudo tail -f /var/log/cron

# 出力例
# Jun 11 03:00:01 hostname CROND[12345]: (root) CMD (/usr/local/bin/backup.sh)
# Jun 11 03:00:01 hostname crond[1234]: (CRON) info (RANDOM_DELAY ...

コマンドの出力をログ化

cron は標準出力・標準エラーをメール送信しようとします。サーバにメール設定が無いと「メール送信失敗」のエラーが大量に出ます。明示的にログファイルへリダイレクトするのが基本:

# 標準出力のみリダイレクト
0 3 * * *  /path/to/cmd >> /var/log/myapp.log

# 標準出力 + 標準エラー両方
0 3 * * *  /path/to/cmd >> /var/log/myapp.log 2>&1

# 出力捨てる (非推奨、エラー追えなくなる)
0 3 * * *  /path/to/cmd > /dev/null 2>&1

# メール送信を抑制
MAILTO=""
0 3 * * *  /path/to/cmd

# メール送信先を変更
MAILTO=admin@example.com
0 3 * * *  /path/to/cmd

5. /etc/crontab と /etc/cron.d/

システム全体の cron は別の場所にも書けます:

場所用途書式
/var/spool/cron/<user>ユーザー個人5 フィールド + コマンド
/etc/crontabシステム全体5 フィールド + ユーザー名 + コマンド
/etc/cron.d/パッケージごとの設定 (推奨)システム書式 (ユーザー名付き)
/etc/cron.hourly/毎時実行スクリプト実行可能ファイルを置くだけ
/etc/cron.daily/毎日実行スクリプト同上
/etc/cron.weekly/毎週実行スクリプト同上
/etc/cron.monthly/毎月実行スクリプト同上
# /etc/cron.d/myapp の例 (ユーザー名フィールドあり)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""

# 分 時 日 月 曜日 ユーザー コマンド
0 3 * * *  appuser  /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
*/5 * * * * appuser  /usr/local/bin/health.sh

6. cron 利用の許可・拒否

# cron 利用を許可するユーザー (1 行 1 ユーザー)
sudo vi /etc/cron.allow
# foo
# bar

# cron 利用を拒否するユーザー
sudo vi /etc/cron.deny

# allow が存在すれば allow リストのみ許可
# allow が無く deny がある場合は deny 以外全員許可
# 両方無ければ root のみ (実装による)

7. SELinux 関連の落とし穴

CentOS 7 はデフォルトで SELinux Enforcing。cron 内のスクリプトが SELinux ポリシー違反で動かないことがあります。

# SELinux 状態確認
getenforce
# Enforcing (有効) / Permissive (警告のみ) / Disabled

# audit ログで cron の拒否を確認
sudo grep -i denied /var/log/audit/audit.log | grep cron

# 一時的に Permissive (検証用)
sudo setenforce 0

# 恒久的に Permissive にする場合 (/etc/selinux/config)
SELINUX=permissive

# ポリシー違反の対処は audit2allow でモジュール作成
sudo grep cron /var/log/audit/audit.log | audit2allow -M mycron
sudo semodule -i mycron.pp

8. 環境変数の落とし穴

cron はログインシェルとは別の環境で動きます。PATH がほぼ空、~/.bashrc は読まれません:

# ❌ cron では動かない (PATH に /usr/local/bin が無い)
0 3 * * *  composer install

# ✅ フルパス指定
0 3 * * *  /usr/local/bin/composer install

# ✅ または crontab 内で PATH 定義
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

0 3 * * *  composer install

# ✅ スクリプト先頭で環境読み込み
0 3 * * *  /bin/bash -lc '/usr/local/bin/myapp.sh'
# -l でログインシェルとして起動 → .bashrc / .profile 読込

9. Laravel scheduler との連携

Laravel では cron を 1 行だけ登録し、フレームワーク側で複数ジョブを管理する方式が主流:

# Laravel の scheduler を毎分起動
* * * * * cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1
// app/Console/Kernel.php
protected function schedule(Schedule $schedule): void
{
    $schedule->command('backup:run')->daily()->at('03:00');
    $schedule->command('queue:prune-failed')->weekly();
    $schedule->job(new SendReports())->cron('0 9 * * 1-5');  // 平日 9:00
    $schedule->call(fn () => Cache::flush())->hourly();
}

10. デバッグ・動作確認

# 構文チェック (crontab -e 終了時にも実行される)
crontab -l | crontab -

# 手動でスクリプトを cron 相当の環境で起動して動作確認
env -i HOME=$HOME LANG=$LANG bash -c '/path/to/script.sh'

# cron ログをリアルタイム監視
sudo tail -f /var/log/cron

# 次回実行予定 (cronie 1.5+)
# CentOS 7 は古いため非対応。crontab -l + 暗算で確認

# 1 分後に実行するテストエントリ
crontab -e
# (現在時刻 +1 分) * * * *  echo "test" >> /tmp/cron-test.log

FAQ

Q: crontab -e 後どこに保存される?
A: /var/spool/cron/<username>。直接編集は避け、必ず crontab -e 経由で (構文チェックが入る)。

Q: 重複実行を避けたい
A: flock でファイルロック:
* * * * * flock -n /tmp/myjob.lock /path/to/myjob.sh

Q: 秒単位の精度で実行したい
A: cron は最短 1 分間隔。秒単位は systemd timer か常駐デーモン (Supervisor) を検討。

Q: コマンドが実行されない
A: ① /var/log/cron に実行ログがあるか確認 → ② 実行ログにあるのに動かない場合 PATH / 環境変数の問題 → ③ ログにも無い場合 crond サービス停止 / 構文エラー / cron.deny / SELinux を疑う。

Q: 標準のメール送信を止めたい
A: crontab 先頭に MAILTO="" または各行に 2>&1 でログ化。