Pleskには自動的にプログラムを実行するための機能「スケジュール済みタスク(いわゆるcron)」があるのですが、そこで指定したプログラムが動作しないという状況が発生しました。
いままで何の気にもせず使っていたので、動作しないということは記述したプログラムが間違ってからと思い調べていたのですが、どうやらそうでもない感じ。
プログラムのソースをみると、phpのmail関数で特定のアドレスメールを送るだけの非常に簡単なモノで記述ミスがあるわけでもないし、管理者としてサーバにSSHログインして実行しても正常に動作する状況で???が浮かぶばかり…
ちなみにプログラムは次の通り
#!/usr/bin/php <?php mail('[email protected]', 'This is Subject', 'This is TEST.', 'From: [email protected]'); ?>
上記のプログラムをスケジューラ経由で実行すると、「スケジューラ通知」に設定しているメールアドレス宛に以下のメールが飛んでくる
Subject: Cron <****@*****> Date: Wed, 6 Apr 2016 11:16:01 +0900 (JST) From: Cron Daemon <root@****> To: [email protected] -: /usr/bin/php: bad interpreter: No such file or directory
「bad interpreter: No such file or directory」 って…ファイルがみつからないなんてナゼ?
昔、「コマンドのシェルとcronのシェルは違うんだよ」と教えてもらったことを思い出し、もしかして今回もそれによるもので発生しているのかと思い、その辺りを中心に情報収集してみると以下のものが見つかり、ビックリ!!
Plesk 10.1 以降、cron タスクの実行は、chroot シェル環境に自動的に制限されます。これは、Plesk 10.1 のクリーンインストール時や、他のプラットフォームまたは旧バージョンの Plesk からデータを移行した時に適用されるデフォルト設定です。
chroot環境でしかcronタスクが実行できないですって…
じゃあ今までなんで気にせず使えていたんだろうか…
これに関しても調べてみると、いままでcronで利用していたものって、ドメイン以下ディレクトリに設置したシェルスクリプトだったので、chroot環境ないで正常に動作できていたのでした。
このchroot環境で動作するのって、
10.0 を含む旧バージョンから Plesk 10.1 にアップグレードした場合、顧客が実行している可能性があるスケジュール済みタスクの実行を妨げることがないように、chroot シェルは自動的には選択されません。
旧バージョンからアップグレードした場合には設定されないというトラップ…
これじゃあ気づきませんよ…
てなことで、上記サイトで公開されている方法を実行して問題は解消しました。
# /usr/local/psa/bin/server_pref -u -crontab-secure-shell "/bin/sh"