本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはsongmuさんこと松木雅幸さんで、
なお本稿のサンプルコードは、
cronとは?
cronは指定日時にジョブの自動実行を行うジョブスケジューラです。UNIX系のOSであれば実装の違いこそあれ、
作業自動化や、
本稿では、
cronの使いどころ
cronの使い途は、
- a.アプリケーションのジョブの実行
- b.システムに関わるジョブの実行
- c.監視用途
a.はアプリケーションで定期的に実行したいジョブの実行です。たとえばランキングの更新処理などの用途です。b.はログのローテートやバックアップなどの用途です。c.の用途は少し意外に感じられるかもしれませんが、
cronの長所と短所
長所
長所としては何より枯れて安定していることが挙げられるでしょう。とにかくcrond
また、
短所
短所としてはやはり、
crontabの指定
cronの設定にはcrontabcrontabコマンドが使われます。
crontabはユーザごとに設定されます。crontabコマンドで編集したcrontabは、/var/に保存されます。ちなみに/etc/というファイルもあるのですが、
crontabの一般的な指定方法
ひとまず気軽に設定する分には、crontab -eを打てば編集画面が立ち上がります。
5 15 14 3 * perl -E 'print "Hello"'たとえば上記のように設定すると、
コマンドの標準出力とエラー出力はまとめられ、$MAILTO環境変数を指定することで送り先を変更できます。出力をメールで送りたくない場合はパイプやリダイレクトで出力先を変更することもできます。最終的な出力がなかった場合にはメールは送られません。
MAILTO="songmu@example.com"
5 15 14 3 - perl -E 'print "Hello"'5 15 14 3 * perl -E 'print "Hello"' | logger -t helloところで、crontab -eでのcrontabの直接編集は実は好ましくありません。crontab -rによるcrontab全消去のオペレーションミスがたびたび話題になります。実はcrontab <filename>とファイル指定することで、
cron指定
crontabは1行1ジョブ指定になります。左からスペース区切りで、
分 時 日 月 曜日 実行コマンド
5 15 14 3 * perl -E 'print "Hello"'曜日は0~7の指定が可能になっており、
各フィールドには単なる数字だけでなく、
-:範囲指定*:全範囲指定/:インターバル指定,:区切り指定
範囲指定
-は範囲指定を表します。たとえば分指定で1-10であれば、
全範囲指定
*はそのフィールドが取り得る全範囲を指定したものと同じです。たとえば、0-59と同様の意味となります。
インターバル指定
「3分おき」/を用いて行います。左に範囲、*/3という指定をした場合は、
全範囲指定と組み合わせて使われることが多いですが、12-27/のような指定もできます。この場合は12分から27分の間に5分おきに実行されます。つまり、
区切り指定
,で区切ることで複数の実行時間や範囲を指定できます。たとえば分指定で1,3,5,8などと指定すれば、
,はこれまでの指定方法と組み合わせて使えます。たとえば0-10,20-45/は、
指定の中で重複があった場合でも、1-10,5-15という指定がされた場合、
これもまた、
そのほかの指定
数字を使う代わりに、sun、、jan、が使えます。また、CRONTAB(5)をご覧ください。
crontab指定のハマりどころ
crontabの指定には、
実行ディレクトリの問題
各cronのジョブが実行される際のカレントディレクトリは、
環境変数
cronの各ジョブ実行時には、$PATHに/usr/しか指定されていないため、
環境変数の指定をcrontabの中に書くことが可能ですが、$PATHに/usr/を追加する場合の間違った例と正しい例は次のようになります。
PATH=/usr/local/bin:$PATHPATH=/usr/local/bin:/usr/bin:/bin足りない環境変数類を補うためや、
うっかり毎分指定
あまりcrontabの設定に馴染みのない人が、
0 5 * * * /path/to/backup.sh* 5 * * * /path/to/backup.sh「そんなことしないよ」
逆に毎分実行したいジョブもあるかと思いますので、
*/1 * * * * /path/to/monitor.sh%のエスケープ
crontabの指定において、%は改行を意味するメタキャラクタです。もし%を記述したい場合は、\%というように\でのエスケープが必要です。
曜日指定の罠
曜日指定と日付指定が同時に指定された場合、
0 0 13 * 5 /path/to/jewison13日の金曜日に実行されることを期待してしまいますが、
0分ちょうど指定を避ける
1時間ごとに行うような定期的な処理は、
特に何らかのクローラを動かしたり、
いろいろハマりどころはありますが、
<続きの