Python(pyenv+Selenium+PhantomJS)でスクレイピングのスクリプトを定期実行しようと、crontabに登録したのだが、実行されなかったので対処法をメモしておきます。
エラー現象など
■OS、Pythonのバージョン
OS:Raspbian for Raspberry Pi
Python:3.6.3(pyenv)
■現象
- cronは起動している状態
- 端末上でPythonスクリプトの直接実行は問題なくできる
- 他のスクリプト(シェル、PHPなど)はcronからも実行できている
- Pythonスクリプトだけcronから実行されない
- ログファイルにはログが吐かれていない
解決方法
結論から言うと、下記で解決しました。解決までに2時間ほどかかってしまいました・・。
- crontabで、pyenv環境下のPythonを明示的に指定して実行
- crontabで、PATHを記載
解決方法の詳細
ログファイルには何も吐き出されていないので、そもそもPythonスクリプトが実行されていない模様でした。
調べてみると、crontabから以下のように「Python」を指定すると、pyenv環境下のPythonではなくデフォルトのPythonを呼びだそうとして、うまく実行されないみたいです。
00 03 * * * cd /var/www/path; python hoge.py
というわけで、pyenv環境下のPythonを明示的に呼び出すようにします。
pythonの場所は、コマンド「which python」で確認可能です。
00 03 * * * cd /var/www/path; /home/ユーザー名/.pyenv/shims/python hoge.py
これでcronから実行したのですが、今度は以下のようなエラーログが出てしまいました。
selenium.common.exceptions.WebDriverException: Message: 'phantomjs' executable needs to be in PATH.
「PhantomJSのPATHが通っていない」的なエラー。
こちらはcrontabにPATHを直接記載することで解消しました。
PATHの内容はコマンド「echo $PATH」で確認可能です。
PATH=/home/ユーザー名/.pyenv/shims:/home/ユーザー名/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games 00 03 * * * cd /var/www/path; /home/ユーザー名/.pyenv/shims/python hoge.py
これでcrontabからPythonスクリプトを実行できました。
pyenvとseleniumを使っていることが、今回のエラー要因でもあったみたいなので、
普通にPython使っている分には起こりえないかもしれませんが・・・。
以上でした。