Debian / Ubuntu で cron を使うときの注意

CentOS

最近サーバーも Debian 系を使うことが増えてきた、というか意識的に CentOS (RHEL) から Ubuntu Server に切り替えているのだけれど、なんか cron が意図したとおりに動かないことが多かったので、気がついたことをメモ。

cron.hourly / cron.daily / cron.monthly が動かない場合

/etc/cron.houly、/etc/cron.daily、/etc/cron.monthly 各ディレクトリに実行ファイルをいれておくと、それぞれ1時間ごと、1日ごと、1ヶ月ごとに実行される。はずである。

しかしレンタルサーバー、クラウドIaaS、VPS のように、テンプレートから展開されたと思われる Debian / Ubuntu 環境では、これがまったく動いていない場合が多いように思う。これは「anacron」が入っていないことが原因かもしれない。Ubuntu Server 16.04 LTS であれば、次のように実行しておいたほうがいい。

sudo apt install anacron
sudo systemctl enable anacron.service
sudo systemctl start anacron.service

これは Raspberry Pi の Raspbian もそうだった。

cron.hourly / cron.daily / cron.monthly / cron.d で使えるファイル名

anacron を動かしても、動くファイルと動かないファイルがあったりする。自分で作ったシェルスクリプトが動かない場合、ファイル名を「〜.sh」のような名前にしていないだろうか。どういうわけか Debian 系では、「.」を含むファイル名は実行対象から除外するらしい。

このルールは /etc/cron.d 以下におく crontab 形式のファイルにも適用される。

/dev/null のあしらい方

/etc/cron.d 以下のファイルや、/etc/crontab へ直接記述したり crontab -e で編集する、いわいる crontab 形式のファイルの中で、コマンドの出力を標準エラー出力も含めてすべて /dev/null にリダイレクトしてメールがとばないようにしたい場合、CentOS (RHEL) であればこのように記述すればよかった。

00 00 25 07 * root /foo/bar >& /dev/null

どうやらこの記述は /bin/sh が実は bash である CentOS (RHEL) では有効だが、/bin/sh が POSIX 準拠な DASH (Debian Almquist shell) である Debian / Ubuntu では、以下のように丁寧に書かないとダメらしい。

00 00 25 07 * root /foo/bar > /dev/null 2>&1

この「2>&1」は「> /dev/null」の前に書くんだったか後に書くんだったかいつも忘れるので面倒くさい。

というか、そもそも全出力を /dev/null に捨てるのはあんましよくないので、こんな感じに syslog にとっといたほうがいいかもしんない。

00 00 25 07 * root /foo/bar 2>&1 | logger -t foobar -p local0.info

コメント