ソフトウェアエンジニア現役続行

雑多なことを綴ります

cronスクリプトをバックグラウンドで実行するときの注意点

cronスクリプトの中でアンパサンド(&)を使ってコマンドをバックグランド処理しようとしても、このコマンドが終了するまでcronは次の処理に移行しません。


どういうことかというと、例えば以下のスクリプトをcronに登録します。

/etc/cron.hourly/sleep15.sh(修正前)

#!/bin/bash
sleep 15 &

これだと、cronは「sleep 15」が終了するのを待ってしまいます。


これを解決するには、このプロセスがopenしているファイルディスクリプタをcloseします。

/etc/cron.hourly/sleep15.sh(修正後)

#!/bin/bash
sleep 15 >/dev/null 2>&1 &

なぜこのようなことをしなくてはならないかというと、cronの仕様がそうなっているからです。


crontab により実行されたコマンドから出力が行われると、cron デーモンは通常その出力結果を登録されたメールアドレス宛に配送します。そのため、cronスクリプトがバックグラウンドで行われていても、そのプロセスがopenしているファイルディスクリプタがcloseされない限り、cronは次の処理に移行しないのです。


以前、ここでハマりました。検索しても情報になかなか行き当たらなかったということは、同じようなことでハマる人はあまりいないということでしょうか。