Linux の crontab コマンド は、ユーザーごとの定期実行ジョブ(cron ジョブ)を登録・確認・削除するためのコマンドです。
「毎日 3 時にバックアップ」「5 分おきに監視スクリプトを実行」などの定期処理を、crontab ファイルに登録しておくことで自動化できます。
通常ユーザーの crontab は crontab -e で編集し、/etc/crontab や /etc/cron.d/ などのシステム全体の設定とは分かれています。
本記事では、ユーザーごとの crontab を管理する crontab コマンドに絞って解説します。
crontab [オプション]
crontab に登録するジョブの書式は次のようになります。
分 時 日 月 曜日 コマンド- 分:0〜59
- 時:0〜23(24 時間表記)
- 日:1〜31
- 月:1〜12
- 曜日:0〜7(0 と 7 が日曜日)
各フィールドには、*(毎回)、カンマ区切り、範囲(1-5)、間隔指定(*/5) などを組み合わせて指定できます。
また @reboot や @daily などの特殊な書式も用意されています。
・自分の crontab を編集する(初回は新規作成)。
crontab -e
現在のユーザーの crontab を編集します。初回実行時は空の状態からスタートします。
設定を保存してエディタを閉じると、cron デーモンに変更が反映されます。
・現在登録されているジョブを一覧表示する。
crontab -l
自分の crontab に登録されているジョブを確認だけしたいときに使います。
設定を変更する前に、必ず crontab -l で現状を把握しておくと安心です。
・自分の crontab をすべて削除する。
crontab -r
現在のユーザーの crontab をまるごと削除します。
取り消しはできないため、本番環境では安易に実行しないよう注意が必要です。
・削除する前に確認のプロンプトを表示する。
crontab -ir
-i オプションを付けることで、削除前に確認メッセージを表示します。
誤って crontab を消してしまう事故を防ぐために、crontab -r よりも安全です。
・別ユーザーの crontab を編集する(管理者権限)。
sudo crontab -u www-data -e
-u オプションでユーザー名を指定すると、そのユーザーの crontab を編集できます。
Web サーバユーザー(例:www-data、apache)としてジョブを動かしたい場合などに使います。
・毎日 3:00 にバックアップスクリプトを実行する。
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
「分=0、時=3、日・月・曜日は *(毎回)」なので、毎日 3:00 に実行されます。
標準出力・標準エラーを /var/log/backup.log にリダイレクトしておくと、トラブル時の調査が楽になります。
・5 分おきに監視スクリプトを実行する。
*/5 * * * * /usr/local/bin/monitor.sh > /dev/null 2>&1
「分」のフィールドに */5 を指定すると、5 分おきに実行されます。
出力を捨てたい場合は、/dev/null にリダイレクトしておくとメールが溜まりません。
・毎週月曜日の 7:30 にレポート生成スクリプトを実行する。
30 7 * * 1 /usr/local/bin/report.sh
曜日フィールドに 1 を指定しているため、毎週月曜日の 7:30 に実行されます。
曜日は 0 または 7 が日曜、1〜6 が月〜土を表します。
・サーバ起動時(再起動時)に一度だけコマンドを実行する。
@reboot /usr/local/bin/startup.sh
@reboot を指定すると、cron デーモン起動時(通常はサーバ起動時)に 1 回だけコマンドが実行されます。
アプリケーションの起動処理などに使えますが、systemd などのサービス管理と役割分担を考えて設計する必要があります。
・毎日 0:00 に実行する(@daily を使う)。
@daily /usr/local/bin/daily_task.sh
@daily は 0 0 * * * と同じ意味です。
他にも @hourly、@weekly、@monthly、@yearly などの特殊指定があります。
・絶対パスでコマンド・ファイルを指定する
cron は通常、対話シェルとは異なる環境変数(PATH など)で動作します。
そのため、コマンドやスクリプト、ファイルは絶対パスで指定するのが安全です。
・環境変数やシェルの違いに注意する
crontab 内で source ~/.bash_profile のような操作を行う場合、
どのシェルで実行されるか(/bin/sh なのか /bin/bash なのか)を意識する必要があります。
必要な環境変数は crontab の先頭に直接書くか、設定用スクリプトを経由して読み込むと安定します。
・出力先を明示してログを残す
標準出力や標準エラーのリダイレクトを指定しないと、メールで root などに送られる設定になっていることが多いです。
ログをファイルに残す場合は、>> /var/log/xxx.log 2>&1 のように明示的に書いておきましょう。
・本番環境の crontab を編集する前にバックアップを取る
crontab -l > crontab.bak のように、編集前の内容をファイルに出力しておけば、
万が一設定を壊してしまった場合でも crontab crontab.bak で復元できます。
・ユーザーを分けてジョブを管理する
Web アプリケーションに関するジョブは Web サーバユーザー、
システムメンテナンス系のジョブは root、というようにユーザーごとに役割分担しておくと、管理やトラブルシュートがしやすくなります。
| short option | long option | description |
|---|---|---|
| -e | ユーザーの crontab を編集する(初回は新規作成) | |
| -l | 現在登録されている crontab の内容を一覧表示する | |
| -r | ユーザーの crontab を全て削除する | |
| -i | crontab を削除する際に確認のプロンプトを表示する(-r と併用して使用) | |
| -u | 指定したユーザーの crontab を操作する(管理者権限が必要) | |
| --help | crontab コマンドの使い方(ヘルプ)を表示して終了する | |
| --version | crontab コマンドのバージョン情報を表示して終了する |
ここでは、ユーザーごとの crontab を管理する crontab コマンドの主なオプションをまとめています。
システム全体の設定(/etc/crontab や /etc/cron.d/ など)については、ディストリビューションや運用ポリシーによって異なるため、各環境のドキュメントもあわせて確認してください。
具体的なジョブの中身は、バックアップスクリプトや監視スクリプトの設計とセットで考える必要があります。
シェルスクリプトの作成には bash スクリプト の基礎知識も役立ちます。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
