Perl Hackers Hub
第25回 cron周りのベストプラクティス(1)
本連載では第一線の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を指定する例
MAILTO="songmu@example.com"
5 15 14 3 - perl -E 'print "Hello"'
パイプ経由でsyslogに投げる例
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:$PATH
正しい例
PATH=/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/jewison
13日の金曜日に実行されることを期待してしまいますが,
0分ちょうど指定を避ける
1時間ごとに行うような定期的な処理は,
特に何らかのクローラを動かしたり,
いろいろハマりどころはありますが,
<続きの
バックナンバー
Perl Hackers Hub
- 第57回 自作ツールによる日常業務効率化―初歩的なコードだけで身近な問題を解決!(3)
- 第57回 自作ツールによる日常業務効率化―初歩的なコードだけで身近な問題を解決!(2)
- 第57回 自作ツールによる日常業務効率化―初歩的なコードだけで身近な問題を解決!(1)
- 第56回 AWS X-Rayによる分散トレーシング―マイクロサービスのボトルネック,障害箇所の特定(3)
- 第56回 AWS X-Rayによる分散トレーシング―マイクロサービスのボトルネック,障害箇所の特定(2)
- 第56回 AWS X-Rayによる分散トレーシング―マイクロサービスのボトルネック,障害箇所の特定(1)
- 第55回 Perlコードの高速化―文字列処理の時間短縮とデータ構造の効率化(3)
- 第55回 Perlコードの高速化―文字列処理の時間短縮とデータ構造の効率化(2)
- 第55回 Perlコードの高速化―文字列処理の時間短縮とデータ構造の効率化(1)
- 第54回 サーバレスでもPerl―Microsoft Azure Functionsで動かそう!(3)