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は次の処理に移行しないのです。
以前、ここでハマりました。検索しても情報になかなか行き当たらなかったということは、同じようなことでハマる人はあまりいないということでしょうか。