cronの設定・基本構文と、ハマりどころの備忘録
はじめに
サーバー運用において、バックアップやログの整理、定期的なバッチ処理など、「決まった時間に決まった処理」を実行したい場面は必ず出てきます。Linuxでこの役割を担うのが、古くから使われているスケジューラーデーモン**「cron」**です。
一見すると地味な存在ですが、cronを使いこなせるかどうかは、サーバー管理の「時間効率」に大きく影響します。
この記事では、自身のWikiメモを元に、cronの基本的な使い方と、初心者が陥りがちな「ハマりどころ」を解説します。
crontabの基本構文
cronの設定は、crontab
というファイルに記述します。その書式は、5つの時間指定フィールドと、実行したいコマンドで構成されます。
# ┌───────────── 分 (0 - 59)
# │ ┌───────────── 時 (0 - 23)
# │ │ ┌───────────── 日 (1 - 31)
# │ │ │ ┌───────────── 月 (1 - 12)
# │ │ │ │ ┌───────────── 曜日 (0 - 6) ※日曜日が0または7
# │ │ │ │ │
# \* \* \* \* \* /path/to/your/command
具体例:
-
* * * * *
: 毎分 -
0 3 * * *
: 毎日 午前3時0分 -
*/15 * * * *
: 15分ごと -
5 4 10 * *
: 毎月10日の午前4時5分
crontabの編集方法
ユーザー個別のcrontabを編集するには、crontab -e
コマンドを使います。
# 現在のユーザーのcrontabを編集する
crontab -e
# 設定した内容を確認する
crontab -l
Tips:
システム全体で共有する/etc/crontab
もありますが、特定のアプリケーションやユーザーに紐づく定期処理は、その処理を実行したいユーザーでログインし、crontab -e
で設定するのが一般的です。
実践的な設定例とハマりどころ
ここからは、実際の運用でよく使う設定と、初心者がつまずきやすいポイントを解説します。
1. 実行ユーザーと権限
cronで実行されるコマンドは、crontab -e
を実行したユーザーの権限で実行されます。
例えば、root
ユーザーのcrontabに登録すればroot権限で、webuser
のcrontabに登録すればwebuser
権限で動きます。ファイルの所有権などを意識して、適切なユーザーで設定しましょう。
2. 環境変数が読み込まれない問題
対話的なログインシェル(普段私たちが使うターミナル)と、cronが実行されるシェルとでは、読み込まれる環境変数が異なります。.bash_profile
などに書いた$PATH
の定義などは、cronの実行時には基本的に読み込まれません。
対策:
-
コマンドは絶対パスで書く:
mysqldump
ではなく/usr/bin/mysqldump
のように、コマンドのフルパスを記述するのが最も確実です。 -
crontab内で変数を定義する: crontabの先頭で
PATH
などを定義することもできます。
3. スクリプトの実行と出力の制御
シェルスクリプトなどを実行する場合、そのスクリプトが出力する内容(標準出力・標準エラー出力)の扱いに注意が必要です。
# 毎日1時5分にバックアップスクリプトを実行
05 1 * * * /root/bin/backup_all-databases.sh >/dev/null 2>&1
末尾の>/dev/null 2>&1
は、非常に重要なおまじないです。
-
>
: 出力のリダイレクト(上書き) -
>/dev/null
: 標準出力を/dev/null
(無を意味する特殊なファイル)に送って、捨てる -
2>&1
: 標準エラー出力(2
)を、標準出力(1
)と同じ場所に送る
これを付けておかないと、スクリプトが何か少しでも文字を出力するたびに、cronが気を利かせて実行ユーザーにメールを送ろうとします。 これにより、サーバーに大量のメールが溜まってしまうことがあるため、意図しない出力は捨てるのが定石です。
エラー時だけ通知が欲しい場合は、スクリプト内でエラー判定をして、エラーの場合のみmail
コマンドで通知を送る、といった工夫をします。
cd
してからコマンドを実行したい
4. スクリプトが特定のディレクトリで実行されることを前提としている場合、cd
コマンドを&&
や;
で繋げて実行します。
# 15分おきにGoogleDrive同期
*/15 * * * * cd ~/GoogleDrive; grive
おわりに
cronは、一度設定すれば黙々と働き続けてくれる、サーバー管理の頼れる相棒です。しかし、その実行環境は通常のシェルとは少し異なるため、いくつかのお作法を知っておく必要があります。
特に、「コマンドは絶対パスで書く」「出力は適切に処理する」という2点を押さえておくだけで、多くのトラブルを防ぐことができます。ぜひ、あなたのサーバーの自動化に役立ててください。
この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MyNote by MEANTIX
Discussion