「夜中にバックアップを取りたいけど、書き方が合っているか不安」
Linuxサーバーの自動化において、避けては通れないのがこの
crontab(クーロンタブ)です。この記事では、定期的にコマンドを自動実行する crontab の設定方法を解説します。基本的な書き方はもちろん、現場で必ずハマる「環境変数の罠」や「ログの確認方法」まで、実務で困らないための鉄則をまとめました。
・「分 時 日 月 曜日 コマンド」の5フィールドの書き方とよく使うパターン
・動かない時の4大原因(絶対パス・環境変数・実行権限・ログ)
・systemd時代の確認方法(systemctl status crond / journalctl -u crond -f)
・/etc/cron.d/・/etc/crontab・ユーザーcrontabの棲み分け
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
※本記事はsystemd前提(cron / crond サービスがsystemdユニットとして稼働)で記述しています。CentOS Stream 9 / Rocky Linux 9 / RHEL 9 / Ubuntu 22.04 LTS / 24.04 LTS で動作確認できる内容です。
1. crontabの基本コマンド(編集・表示・削除)
crontabの設定は、専用のコマンドを使って行います。直接ファイル(/var/spool/cron/など)を編集するのはご法度です。設定を編集する: -e
# crontab -e
設定を表示する: -l
現在登録されている内容を確認するには-l(list)オプションを使います。# crontab -l 0 4 * * * /root/backup.sh
設定を全削除する: -r(要注意)
-r(remove)オプションは、登録されているすべての crontab 設定を確認なしに即削除します。-e と打ち間違えると取り返しがつかないため、現場では使用を避けてバックアップを取ってから削除するのが鉄則です。(下記コマンドの実行前に必ずバックアップを取りましょう)
# crontab -l > ~/crontab_backup.txt # crontab -r
2. スケジュールの書き方(5つの星の意味)
crontabには、左から順に「分・時・日・月・曜日」を指定し、最後に「実行したいコマンド」を書きます。書式:
分 時 日 月 曜日 コマンド| 項目 | 設定できる値 | 意味 |
|---|---|---|
| 分 | 0~59 | 何分に実行するか |
| 時 | 0~23 | 何時に実行するか |
| 日 | 1~31 | 何日に実行するか |
| 月 | 1~12 | 何月に実行するか |
| 曜日 | 0~7 | 0と7は日曜日、1は月曜日... |
よく使う設定例
・毎日 朝4:00に実行:0 4 * * * /path/to/script.sh・毎時 0分に実行(1時間に1回):
0 * * * * /path/to/script.sh・平日(月~金)の12:30に実行:
30 12 * * 1-5 /path/to/script.sh・5分ごとに実行:
*/5 * * * * /path/to/script.sh3. 【現場の鉄則】cronが動かない時の4大原因と対策
「設定したのに動かない!」というトラブルのほぼ全ては、以下の4つが原因です。① コマンドは必ず「絶対パス」で書く
cronで実行される環境では、普段あなたがログインしている時のようなPATH(パス)が通っていません。そのため、python や backup.sh とだけ書いても「そんなコマンドは見つかりません」とエラーになります。・× ダメな例:
0 4 * * * python script.py・○ 正解の例:
0 4 * * * /usr/bin/python3 /home/user/script.pyコマンドもスクリプトも、すべて
/ から始まる絶対パスで書くのが鉄則です。② 環境変数が引き継がれない
cronが実行される環境は、ログイン時のシェルとは別の「最小限の環境」です。PATH だけでなく、JAVA_HOME や LANG(文字コード)などの環境変数も引き継がれません。スクリプトが文字化けしたり、Javaコマンドが見つからないといったトラブルの多くは、crontabの冒頭に必要な環境変数を直接記述することで解決できます。
# crontab -e で設定ファイルの冒頭に環境変数を記述する LANG=ja_JP.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0 4 * * * /root/backup.sh
③ 実行権限を確認する
実行したいスクリプト自体に「実行権限」がないと、cronは起動に失敗します。# chmod +x /home/user/script.sh
chmod +x で実行権限を付与しておきましょう。④ ログファイル(/var/log/cron)を確認する
動かない時は、悩む前にログを見ましょう。cronの実行履歴は/var/log/cron に出力されます。# tail -f /var/log/cron Feb 24 10:00:01 server CROND[1234]: (root) CMD (/root/backup.sh)
systemctl status crond(Ubuntu/Debian系は systemctl status cron)でサービスの状態を確認してください。※また、Ubuntu/Debian系では実行ログも
/var/log/cron ではなく /var/log/syslog に出力されます。ログエントリの読み方
/var/log/cron の各行は、以下のフィールドで構成されています。出力例:
Mar 26 10:00:01 web01 CROND[3692]: (root) CMD (/usr/lib64/sa/sa1 1 1) Mar 26 10:01:01 web01 CROND[3715]: (root) CMD (run-parts /etc/cron.hourly) Mar 26 10:05:01 web01 CROND[3801]: (webadmin) CMD (/home/webadmin/backup.sh)
| フィールド | 例 | 意味 |
|---|---|---|
| 日付・時刻 | Mar 26 10:00:01 | ジョブが実行された日時 |
| ホスト名 | web01 | 実行されたサーバーのホスト名 |
| プロセス情報 | CROND[3692] | cronデーモンのプロセスID |
| 実行ユーザー | (root) | そのジョブを実行したユーザー |
| 実行コマンド | CMD (/usr/lib64/sa/sa1 1 1) | 実際に実行されたコマンド |
特定のジョブだけをログから絞り込む
/var/log/cron にはシステム全体のcronジョブが記録されるため、自分のジョブだけを確認したい場合は grep で絞り込みます。# 特定のユーザーのジョブだけ表示 grep "(webadmin)" /var/log/cron # 特定のスクリプト名で絞り込み grep "backup.sh" /var/log/cron # 今日の実行分だけ表示(3月26日の例) grep "Mar 26" /var/log/cron # リアルタイムで監視(ジョブの実行タイミングを待つ時に便利) tail -f /var/log/cron | grep "backup.sh"
ログが出力されない場合の対処
/var/log/cron にログが出ない場合は、以下の2点を確認してください。・rsyslogの設定:cronのログ出力はrsyslogが担当しています。設定ファイルで
cron.* の行が有効か確認します。# rsyslogの設定を確認 grep cron /etc/rsyslog.conf
cron.* /var/log/cron
# を削除して rsyslog を再起動します。# rsyslogを再起動してログ出力を有効化 systemctl restart rsyslog
/var/log/cron ではなく /var/log/syslog に出力されます。# Ubuntu/Debianでcronログを確認 grep CRON /var/log/syslog
4. ユーザーcrontabと /etc/cron.d / /etc/crontab の違い
cronには「ユーザーごとのcrontab」と「システム全体のcrontab」の2系統があります。現場ではこの違いを正しく押さえておくことが重要です。・ユーザーcrontab:
crontab -eで編集する個人用設定。/var/spool/cron/<ユーザー名>に保存され、そのユーザー権限で実行される・/etc/crontab:システム全体のcrontab。フィールドが7つ(分 時 日 月 曜日 ユーザー名 コマンド)になり、実行ユーザーを指定できる
・/etc/cron.d/:パッケージや運用スクリプトを配置するディレクトリ。1ファイル=1設定として管理しやすく、構成管理ツール(Ansible等)との相性が良い
・/etc/cron.{hourly,daily,weekly,monthly}/:シンプルな定期スクリプトを置くだけで自動実行されるディレクトリ。実行時刻はanacronまたはrun-partsで制御される
本番運用では、パッケージ由来の設定は
/etc/cron.d/、運用ジョブは/etc/cron.d/または/etc/crontab、個人ジョブのみユーザーcrontabという棲み分けが定番です。journalctlでcronログを追う(systemd時代の定番)
rsyslog経由の/var/log/cronだけでなく、systemdジャーナルからもcronの実行履歴を直接追えます。Ubuntuなど/var/log/cronが無い環境ではこちらが便利です。# crondサービスのログだけを最新20件表示 $ journalctl -u crond -n 20 --no-pager # リアルタイム追跡(実行タイミングを待つ時に便利) $ journalctl -u crond -f # Ubuntu/Debian系 $ journalctl -u cron -f
本記事のまとめ
| やりたいこと | コマンド・書き方 |
|---|---|
| 設定を編集する | crontab -e |
| 設定を確認する | crontab -l |
| 設定を全削除する(必ずバックアップ後に実行!) | crontab -r |
| 特定のユーザーの設定を編集 | crontab -u ユーザー名 -e |
| 実行ログを確認する(RHEL系) | tail -f /var/log/cron |
| 実行ログを確認する(Ubuntu/Debian系) | tail -f /var/log/syslog |
| サービスの稼働確認 | systemctl status crond(Ubuntu系は cron) |
crontabが動かない原因を自分で特定して直せていますか?
コマンドの使い方を一つひとつ覚えていくのは時間がかかります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:unaliasコマンドでエイリアスを削除する方法|alias一覧の確認と永続化の解除も
- 前のページへ:bcコマンドでコマンドラインから計算する方法|小数計算やシェルスクリプト連携も
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドA-E・プロセス管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます