crontab の使い方
/etc/crontab を直接編集する場合は、そのままviなどでテキストを編集するだけなので、特別な解説も必要ないと思います。crontabコマンドを使う場合との違いは、フォーマットの違いにあります。
crontab コマンドでは、cron設定の編集、削除などを行うことができます。
使い方: crontab [-u ユーザ] file
crontabのファイルを指定する
crontab [ -u ユーザ ] [ -i ] { -e | -l | -r }
-e (今ログイン中 or 指定のユーザで)編集する
-l (今ログイン中 or 指定のユーザで登録している)crontabリストを出力する
-r (今ログイン中 or 指定のユーザで登録している)crontabリストを削除する
-i (今ログイン中 or 指定のユーザで登録している)crontabリストを削除する際に確認メッセージを表示する
|
crontab コマンドには、大きく2つの役割があります。
- crontabファイルの指定
- cron設定の編集、削除
の2つです。
crontab で編集する
先に記述したように
直接 /etc/crontab を直接編集するにしても、crontabコマンドを使用する場合にしても
crontab の設定は、テキストファイル ( crontabファイル ) の編集を行うことで設定します。
そのテキストファイル ( crontabファイル ) のフォーマットは、ほぼ同じ(ユーザ情報があるかないかの違いだけです)です。
以下にcrontabコマンドでの設定例を元に簡単に解説してみます。
$ crontab -e
|
とすると、以下のようにGNU nano (テキストエディタ)が起動されます。
このGNU nano (テキストエディタ)で起動する月日時分、実行するコマンドを指定することでcronの設定を行います。
crontabコマンドでは、下記のようなフォーマットになります。
# (設定フォーマット)
# m h dom mon dow command
# 分 時 日 月 曜 コマンド
* * * 1 * /bin/sh /home/hoge/testmonth.sh
# (行頭の # マークはコメント行を示す)
#
# * * * * * 実行されるコマンド
# | | | | |
# | | | | +---- 曜日 (0 - 6) (日曜日=0 or 7)
# | | | +------ 月 (1 - 12)
# | | +-------- 日 (1 - 31)
# | +---------- 時 (0 - 23)
# +------------ 分 (0 - 59)
# (数字の指定方法)
# * : 指定なし(毎(分時日月曜)を意味する)
# 数値 : 各指定箇(順)所にて 分 時 日 月 曜 を表します。
# 例)
# 44 1 * * * : 毎日1時44分に起動
# 44 1-3 * * * : 毎日1時から3時の間に各時44分に起動(つまり、1時、2時、3時の44分に起動)
# 44 1,2,3 * * * : 毎日1時、2時、3時の44分に起動(上の指定と同じ) カンマで区切って複数指定可(ただし、間に空白を入れてないならない)。
# 44 */3 * * * : 毎日3時時間おきに起動(つまり、1日に3時間毎の44分に8回起動)
|
/etc/crontab を直接編集する場合は、以下のようなフォーマットになります。
# (設定フォーマット)
# m h dom mon dow user command
# 分 時 日 月 曜 実行ユーザ コマンド
* * * 1 * hoge /bin/sh /home/hoge/testmonth.sh
|
曜日とコマンドの間に
実行ユーザ名を指定する点のみが異なります。この点以外は、全く同じです。
編集を終えたら、Ctrl+O で保存、Ctrl+X で終了です。
特に誤りがあった場合は、終了時にエラーが表示されます。
"/tmp/crontab.yZ0Cfh/crontab":1: bad day-of-week
errors in crontab file, can't install.
Do you want to retry the same edit? (y/n)
|
y : ファイルを再編集します。
n : 編集内容を破棄して終了します。
のいずれかを選択することになります。
crontab で内容を確認する
直接 /etc/crontab を直接編集する場合は、rm コマンドでファイルを丸ごと削除できます。同じように crontabコマンドを使用しても編集内容を丸ごと削除できます。
$ crontab -r
|
何の確認もなく削除されます。通常は、-i オプションを追加して削除します。
$ crontab -i -r
crontab: really delete hoge's crontab? (y/n)
|
このように確認メッセージが表示されます。そこで y を選択することで削除が実行されます。
このように
-r オプションは誤って使った場合に、丸ごと削除されてしまうので、
通常は、各ユーザのホームディレクトリの
.bashrc あるいは
.bash_profile ファイルに alias を定義します。
$ vi ~/.bashrc
..
alias crontab='crontab -i'
|
で保存した後に、編集した
.bashrcを読み込み、-r オプションのみで実行してみてください。
$ source ~/.bashrc
$ crontab -r
crontab: really delete hoge's crontab? (y/n)
|
と確認メッセージが表示されるようになると思います。
crontab で内容を確認する
直接 /etc/crontab を直接編集する場合は、cat コマンドで内容を確認できます。同じように crontabコマンドを使用しても内容を確認するこができます。
$ crontab -l
* * * 1 * /bin/sh /home/hoge/testmonth.sh
|
crontab で作成するファイルの保存先
crontabで編集されたファイルは、以下のディレクトリにユーザ名をファイル名として自動的に保存されます。
CentOS ScientificLinux
$ ls -l /var/spool/cron/
hoge
|
Debian Ubuntu
$ ls -l /var/spool/cron/crontabs/
hoge
|
ファイル名および保存先ディレクトリの変更をしたいなら、下記のように crontab コマンド投入で変更できます。
$ crontab ~/local_crontab
|
これ以降、
crontab -e で編集されるファイルは、~/local_crontab になります。
ただし、crontab -r で削除した場合、初期状態に戻ります。
crontab のテストでよくある失敗
- 早くテストしたいので1分後に起動時間を設定してしまう
少なくとも2分以上の間隔をおいて指定する必要があります。それは、crondがファイルの更新に気づくのは、最長で1分後です。その後、実行しますから、2分の間隔は必要ということになります。
ただし、1分後として、crondを再起動して無理やり更新させてしまうという手段はあります。
- コマンド指定で % をそのまま使ってしまう
$ crontab -e
...
1 * * * * echo `date "+%Y%m%d"`
|
これだと、以下のようなエラーが出力されます。
/bin/sh: Syntax error: EOF in backquote substitution
|
これを、以下のように % をエスケープして 編集しなおすとエラーが出力されなくなります。
$ crontab -e
...
1 * * * * echo `date "+\%Y\%m\%d"`
|
あるいは、
$ crontab -e
...
1 * * * * echo $(date +\%Y\%m\%d)
|
- テストの度にメール送信してしまう
cron実行で、エラーなど出力情報がある場合は、メールにてエラー通知されます。
そこで、メールへの送信をテストしている間くらいは停止したいところです。その際、crontabにて設定情報の先頭に以下のようにメール送信先をブランク設定すれば、メール送信されなくなります。
$ crontab -e
...
MAILTO=""
|
もちろんメールの送信先を変更する際も利用できます。
- 日と週を同時に設定して誤動作してしまう
実行する日と週を同時に設定する場合は、OR判断されるので注意が必要です。
$ crontab -e
...
1 2 1-7 * 0 echo `date "+\%Y\%m\%d"`
|
上記では、毎月第一日曜日にコマンドが実行されるわけではないことに注意する必要があります。
この設定では、毎月、1日から7日と毎週日曜日にコマンドが実行されてしまいます。
つまり、日と曜日の設定を同時に行う場合は、AND判断されるわけでなくOR判断されることに注意する必要があります。
- * を省略と誤った使い方をして誤動作してしまう
実行する分時日月曜を * を使った場合、それは、毎 ということであることに注意する必要があります。
$ crontab -e
...
* 1 * * * echo `date "+\%Y\%m\%d"`
|
上記では、毎日1時にコマンドが実行されるわけではないことに注意する必要があります。
この設定では、毎日1時から2時までの間、1分毎(毎分)にコマンドが実行されてしまいます。
ここで、毎日1時に1回だけ実行したいのであれば、ちゃんと何分まで指定する必要があります。
$ crontab -e
...
0 1 * * * echo `date "+\%Y\%m\%d"`
|
このように設定すれば、毎日1時ちょうどにコマンドが実行されます。
これは、日を指定して時、分を * にしてしまう場合も同じように間違いやすいので注意が必要です。
cronは、windowsでのタスク(スケジューラ)のようなものです。
使いこなすと自動化ができて便利です。使い方も非常にシンプルで設定する内容も簡素です。
簡素であるが故に、間違いやすいところも多いので、注意して使いましょうね。
個人的にもよく間違うので備忘録です。
コメントを投稿 :