Linuxサーバーを運用していると、バックアップの実行やログの整理、定期的なレポート生成など、決まった時間に自動で処理を実行したい場面が頻繁にあります。そんな時に活躍するのが、Linux標準のジョブスケジューラであるcronと、その設定を行うcrontabコマンドです。
この記事では、crontabの基本的な使い方から、ジョブの登録・確認・削除方法、そして知っておくと便利な設定例までを解説します。
- crontabの基本的な書式と時間の指定方法
- 定期実行ジョブの登録、確認、削除方法
- crontabの応用的な使い方(エイリアス、出力制御など)
- 困った時のトラブルシューティングと調査方法
crontab(クロンタブ)は、ユーザーごとに定期的に実行したいコマンドやスクリプトを登録するためのファイル、またはそのファイルを編集するコマンドのことです。crontabに登録されたジョブは、cronデーモンによって指定された時間に自動的に実行されます。
crontabを操作するための主なコマンドは以下の通りです。
コマンド | 意味 |
---|---|
crontab -e |
現在のユーザーのcrontabファイルを編集します。初回実行時にはエディタ選択を求められることがあります。 |
crontab -l |
現在のユーザーのcrontabファイルの内容を表示します。 |
crontab -r |
現在のユーザーのcrontabファイルを削除します。これにより登録されているジョブが全て削除されますので、実行には注意が必要です。 |
crontab -e -u <user> |
特定のユーザーのcrontabファイルを編集します。rootユーザーのみ実行可能です。 |
crontab -l -u <user> |
特定のユーザーのcrontabファイルの内容を表示します。rootユーザーのみ実行可能です。 |
crontabのエントリは、以下の5つの時間指定フィールドと、実行するコマンドから構成されます。
分 時 日 月 曜日 実行コマンド
各フィールドの意味と指定できる値は以下の通りです。
フィールド | 意味 | 指定できる値 |
---|---|---|
分 |
0-59 | 毎時0分に実行する場合: 0 |
時 |
0-23 | 毎日午前3時に実行する場合: 3 |
日 |
1-31 | 毎月1日に実行する場合: 1 |
月 |
1-12 | 毎年1月に実行する場合: 1 |
曜日 |
0-7 (0と7は日曜日) | 毎週日曜日に実行する場合: 0 または 7 |
特殊な記号
記号 | 意味 | 例 |
---|---|---|
* |
全ての時間、日、月、曜日に一致(毎日、毎時、毎分など) | * * * * * command (毎分実行) |
, |
複数の値を指定 | 0 3,15 * * * command (毎日3時と15時に実行) |
- |
範囲を指定 | 0 9-17 * * * command (毎日9時から17時まで毎時0分に実行) |
/ |
間隔を指定(例: /5 は5分ごと) |
*/5 * * * * command (5分ごとに実行) |
バックアップスクリプト /home/user/backup.sh
を毎日午前2時30分に実行したい場合を考えます。
-
crontabの編集モードに入る
crontab -e
-
以下の行を追加して保存
30 2 * * * /bin/bash /home/user/backup.sh
保存後、
crontab: installing new crontab
のようなメッセージが表示されれば成功です。crontab -e
で編集した内容は、保存すると同時にcronデーモンに読み込まれ、即座に反映されます。複数行のジョブも、この1つのファイルにまとめて記述して問題ありません。
特殊な書式エイリアス
cronには、日付指定が複雑な場合に便利なエイリアスが用意されています。
エイリアス | 意味 | 分 時 日 月 曜日 の指定と同等 |
---|---|---|
@reboot |
起動時に1回実行 | ―(システム起動時) |
@yearly |
年に一度 | 0 0 1 1 * (毎年1月1日 0時0分) |
@annually |
年に一度 | 0 0 1 1 * (毎年1月1日 0時0分) |
@monthly |
月に一度 | 0 0 1 * * (毎月1日 0時0分) |
@weekly |
週に一度 | 0 0 * * 0 (毎週日曜日 0時0分) |
@daily |
毎日 | 0 0 * * * (毎日 0時0分) |
@hourly |
毎時 | 0 * * * * (毎時0分) |
例:サーバー起動時にスクリプトを実行
@reboot /home/user/startup.sh
例:毎日バックアップスクリプトを実行
@daily /home/user/daily_backup.sh
ジョブの出力制御
cronジョブの標準出力や標準エラー出力は、デフォルトでcrontabを登録したユーザーのメールアドレスに送信されます。これを止めたり、ファイルにリダイレクトしたりできます。
-
出力を完全に破棄する
メール通知が不要な場合、
/dev/null
にリダイレクトします。2>&1
は標準エラー出力も標準出力と同じ場所(ここでは/dev/null
)にリダイレクトする意味です。30 2 * * * /bin/bash /home/user/backup.sh > /dev/null 2>&1
-
特定のファイルにログを出力する
実行結果をファイルに残したい場合は、ファイルにリダイレクトします。
>>
は追記モードです。30 2 * * * /bin/bash /home/user/backup.sh >> /var/log/backup_cron.log 2>&1
-
通知メールの送信先を変更する
crontabファイルの先頭に
MAILTO
変数を設定することで、通知メールの送信先を変更できます。MAILTO
はファイル内で最初に設定すれば、以降のすべてのジョブに適用されます。空にするとメールは送信されなくなります。MAILTO="your_email@example.com" # MAILTO="" # メールを送信しない場合 30 2 * * * /bin/bash /home/user/backup.sh
crontabのバックアップと復元
誤ってcrontabを削除してしまったり、別のサーバーに同じ設定を移行したい場合に役立ちます。
-
現在のcrontabをバックアップ
crontab -l > mycrontab.bak
-
バックアップしたcrontabを復元
crontab mycrontab.bak
このコマンドを実行すると、既存のcrontabは上書きされるので注意してください。
crontabの編集を取り消したい(保存せず終了)
crontab -e
で編集中に、誤って変更してしまった内容を保存せずに終了したい場合、以下のエディタ操作が役立ちます。
- viエディタの場合:
Esc
キーを押した後、:q!
と入力してEnter
- nanoエディタの場合:
Ctrl + X
を押した後、N
(No)を押してEnter
ジョブが実行されない
- 実行パスの確認: crontabは実行環境のPATHが限定的です。コマンドは絶対パスで指定するか、スクリプト内でPATHを設定しましょう。
- 例:
/usr/bin/php
や/usr/local/bin/python
など。
- 例:
- 環境変数の確認: スクリプトが特定の環境変数に依存する場合、crontab内で設定するか、スクリプトの先頭で設定してください。
- 実行ユーザーの確認: crontabは、登録したユーザーの権限で実行されます。必要な権限があるか確認しましょう。
- シェルの確認: スクリプトの先頭に
#!/bin/bash
や#!/usr/bin/python
のように、使用するインタプリタを明記(シバン)しましょう。 - ログの確認:
- ジョブの実行結果は、通常は実行ユーザーにメールで送信されます。
mail
コマンドで確認するか、コマンドの最後に>> /var/log/cron_job.log 2>&1
を追加して標準出力と標準エラー出力をファイルにリダイレクトし、ログを確認します。 - cronデーモン自体のログを確認することも重要です。
- CentOS/RHEL系:
/var/log/cron
- Ubuntu/Debian系:
/var/log/syslog
またはjournalctl -u cron.service
これらのログでcronデーモンが正常に動作しているか、ジョブが実行された記録があるかを確認できます。
- CentOS/RHEL系:
- ジョブの実行結果は、通常は実行ユーザーにメールで送信されます。
cronデーモンの状態確認(OSによる違い)
cronデーモンがそもそも起動しているか確認します。コマンドはLinuxディストリビューションによって異なる場合があります。
- systemdを使用するディストリビューション(Ubuntu 15.04以降, CentOS 7以降など)
systemctl status cron # Ubuntu/Debian系 systemctl status crond # CentOS/RHEL系
- 古いSysVinitを使用するディストリビューション
service cron status # Ubuntu/Debian系 service crond status # CentOS/RHEL系
システム全体のcrontabファイル
一般的なユーザーは crontab -e
で個人用のcrontabを編集しますが、システム全体で管理されるcrontabファイルも存在します。
主に /etc/crontab
や /etc/cron.d/
ディレクトリ内のファイルで、これらはroot権限で編集し、cron
デーモンが直接読み込みます。ユーザーごとのcrontabと異なり、実行するユーザーを明示的に指定できるのが特徴です。
大量のシステムジョブや、特定のアプリケーションの定期実行を設定する際に利用されますが、通常は個人用の crontab -e
で十分です。
この記事では、Linuxの定期実行を司るcrontabについて、その基本からジョブの登録、確認、削除、応用的な使い方、そしてトラブルシューティングまでを解説しました。crontabを使いこなすことで、日々のLinuxサーバー管理・運用が格段に楽になります。
この記事がcrontabについて理解を深める一助となれば幸いです。
ご覧いただきありがとうございました。
次回はディスク容量の確認と整理方法について解説します。