cron / crontab の設定方法|Linuxで定期実行を自動化する

未分類

Linuxのcronは、指定した日時・間隔でコマンドやスクリプトを自動実行するデーモンです。crontabはそのスケジュール設定ファイルのことで、crontabコマンドで管理します。バックアップ・ログローテーション・定期レポート送信など、日常的な運用自動化に欠かせないツールです。

cron とは

cronはLinux/Unix系OSで標準的に利用されるジョブスケジューラです。システム起動時にバックグラウンドで起動し(デーモンとして常駐)、設定ファイル(crontab)に書かれたスケジュールに従ってコマンドを実行します。

  • cron:バックグラウンドで動き続けるデーモンプロセス(crond または cron
  • crontab:スケジュール定義ファイル。ユーザーごとに独立して設定可能
  • crontab コマンド:crontabファイルを操作するコマンド(編集・一覧・削除など)

crontab コマンドの基本操作

crontabの操作は主に3つのオプションを使います。

コマンド説明
crontab -ecrontabを編集する(エディタが開く)
crontab -lcrontabの内容を一覧表示する
crontab -rcrontabを削除する(全削除されるため注意)
crontab -u ユーザー名 -l他のユーザーのcrontabを表示(root権限が必要)

crontab -e:編集

crontab -e

EDITORまたはVISUAL環境変数に設定されたエディタが起動します。未設定の場合はnanoviが使われます。保存して閉じると設定が即座に反映されます。

crontab -l:一覧表示

crontab -l

現在のユーザーのcrontab内容を標準出力に表示します。cronジョブが設定されていない場合は no crontab for ユーザー名 と表示されます。

# 実行例
$ crontab -l
0 2 * * * /home/user/backup.sh
*/5 * * * * /usr/local/bin/check_disk.sh

crontab の書式

crontabの各行は次の形式で記述します。

分  時  日  月  曜日  実行コマンド
フィールド範囲説明
分(minute)0〜59実行する分
時(hour)0〜23実行する時
日(day of month)1〜31実行する日
月(month)1〜12実行する月
曜日(day of week)0〜7(0と7が日曜日)実行する曜日

各フィールドには次の記法が使えます。

  • *:すべての値に一致(毎分・毎時など)
  • */n:n間隔ごと(*/5 なら5分ごと)
  • a-b:aからbの範囲(1-5 なら月〜金)
  • a,b,c:複数の値を列挙(1,15 なら1日と15日)

よく使うスケジュール設定例

# 毎日午前2時にバックアップを実行
0 2 * * * /home/user/backup.sh

# 5分ごとにディスク使用量をチェック
*/5 * * * * /usr/local/bin/check_disk.sh

# 毎週月曜日の朝9時にレポートを送信
0 9 * * 1 /home/user/weekly_report.sh

# 毎月1日の深夜0時にログをアーカイブ
0 0 1 * * /usr/local/bin/archive_logs.sh

# 平日(月〜金)の毎正時にジョブを実行
0 * * * 1-5 /home/user/workday_job.sh

# 毎日午前0時と正午の2回実行
0 0,12 * * * /home/user/twice_daily.sh

# 毎時15分・45分に実行
15,45 * * * * /home/user/check.sh

# 1時間ごとに実行(毎時0分)
0 * * * * /home/user/hourly.sh

# 毎分実行(テスト・監視用)
* * * * * /home/user/monitor.sh

特殊文字列(@マクロ)

よく使うスケジュールは @ から始まる特殊文字列で簡潔に書けます。

記法意味
@rebootシステム起動時に1回だけ実行
@yearly@annually年に1回(0 0 1 1 * と同じ)
@monthly月に1回(0 0 1 * * と同じ)
@weekly週に1回(0 0 * * 0 と同じ)
@daily@midnight毎日1回(0 0 * * * と同じ)
@hourly毎時1回(0 * * * * と同じ)
# 起動時に自動実行
@reboot /home/user/start_service.sh

# 毎日深夜に実行
@daily /home/user/daily_cleanup.sh

環境変数の設定

cronの実行環境は通常のシェルと異なり、PATHなどの環境変数が最小限しか設定されていません。crontabファイル内で環境変数を定義できます。

# crontabの先頭で環境変数を定義
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/home/user/bin
MAILTO=admin@example.com

# コマンドの出力は MAILTO で指定したアドレスにメール送信される
0 2 * * * /home/user/backup.sh

# メール送信を無効にする(出力を破棄)
0 * * * * /home/user/job.sh > /dev/null 2>&1

MAILTO="" を設定するとメール送信を無効化できます。コマンドの出力ログを残したい場合は > /var/log/myjob.log 2>&1 のようにファイルにリダイレクトしましょう。

実行ログの確認方法

cronが実際に動作したかどうかはシステムログで確認できます。

systemd(journald)環境

# cronのログをリアルタイムで表示
journalctl -u cron -f

# 直近のcronログを確認
journalctl -u cron --since "1 hour ago"

# cronジョブの実行履歴(全件)
journalctl -u cron

syslog環境(/var/log/syslog)

# syslogからcronのログを抽出
grep CRON /var/log/syslog

# リアルタイムで確認
tail -f /var/log/syslog | grep CRON

# cronログ専用ファイルが存在する場合
tail -f /var/log/cron

ログには CMD (/home/user/backup.sh) のようにコマンド実行の記録が残ります。ここに記録されていない場合はcron自体が動作していない可能性があります。

cron が実行されない時の確認項目

crontabに設定したのにコマンドが実行されない場合は、以下の順番で確認します。

1. cron デーモンが起動しているか確認

# systemdの場合
systemctl status cron      # Debian/Ubuntu
systemctl status crond     # RHEL/CentOS

# 起動していない場合
sudo systemctl start cron
sudo systemctl enable cron  # 自動起動を有効化

2. crontab の書式エラーを確認

# 現在のcrontabを表示して確認
crontab -l

# よくある書式ミス例
# NG: 分・時フィールドの範囲外(60分や25時など)
# NG: フィールドが5つ未満または多すぎる
# NG: コマンドパスのタイポ

3. スクリプトに実行権限があるか確認

# 実行権限を確認
ls -la /home/user/backup.sh

# 実行権限がない場合は付与
chmod +x /home/user/backup.sh

4. コマンドのパスを絶対パスで指定しているか確認

cronのPATHは通常のシェルより短く、/usr/local/binなどが含まれない場合があります。コマンドは絶対パスで指定するのが安全です。

# NG: 相対パスやエイリアス
0 2 * * * backup.sh
0 2 * * * python script.py

# OK: 絶対パスで指定
0 2 * * * /home/user/backup.sh
0 2 * * * /usr/bin/python3 /home/user/script.py

5. スクリプトのエラーをログに出力して確認

# 標準出力と標準エラーをログファイルに記録
0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1

# ログを確認してエラーがないか調べる
tail -f /var/log/backup.log

6. ユーザーの cron 実行が許可されているか確認

# /etc/cron.allow が存在する場合、このファイルにユーザー名がある必要がある
cat /etc/cron.allow

# /etc/cron.deny が存在する場合、このファイルにユーザー名があると実行できない
cat /etc/cron.deny

7. スクリプト単体での動作確認

# cron と同じ最小限の環境変数でスクリプトをテスト実行
env -i HOME=/root SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin /home/user/backup.sh

システム全体の cron 設定ファイル

ユーザーごとの crontab -e 以外に、システム全体の定期実行ファイルが存在します。

場所説明
/etc/crontabシステム全体のcrontab(ユーザー名フィールドが追加される)
/etc/cron.d/パッケージが追加するcron設定ファイルを置くディレクトリ
/etc/cron.hourly/1時間ごとに実行されるスクリプト置き場
/etc/cron.daily/毎日実行されるスクリプト置き場
/etc/cron.weekly/毎週実行されるスクリプト置き場
/etc/cron.monthly/毎月実行されるスクリプト置き場
# /etc/crontab の書式(ユーザー名フィールドが追加される)
# 分  時  日  月  曜日  ユーザー  コマンド
0 2 * * * root /usr/local/bin/backup.sh

# /etc/cron.daily/ にスクリプトを置くだけで毎日実行される
sudo cp myjob.sh /etc/cron.daily/
sudo chmod +x /etc/cron.daily/myjob.sh

まとめ

cronとcrontabの基本操作をまとめます。

  • crontab -e:スケジュールを編集する
  • crontab -l:現在の設定を確認する
  • 書式は 分 時 日 月 曜日 コマンドの順で記述する
  • コマンドは絶対パスで指定し、実行権限を付与しておく
  • 実行されない場合は journalctl -u cron または grep CRON /var/log/syslog でログを確認する
  • @reboot@daily@weeklyなどの特殊記法を使うと記述が簡潔になる
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント