シュンカの日記

基本的に書きたいことを書いていくスタイル。

pythonスクリプト(pyenv+Selenium+PhantomJS)をcrontabから実行できない場合

【スポンサーリンク】

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使っている分には起こりえないかもしれませんが・・・。

以上でした。