ロリポップのレンタルサーバーでPythonスクリプトを定期実行する際に、Cron設定でシェルスクリプト(sh)やPythonスクリプト(py)を直接実行しようとしてもうまく動作しないケースがありました。そこで、PHPスクリプトを介してPythonスクリプトを呼び出す方法を試したところ、問題なく動作させることができました。この記事では、その経緯と解決方法をまとめます。

 

問題点

ロリポップのCronでPythonスクリプトやシェルスクリプトを直接実行しようとしたところ、次のような問題が発生しました:

  1. シェルスクリプトが実行されない
    権限や環境変数を適切に設定しても、Cronからの実行結果が反映されませんでした。
  2. Pythonスクリプトの直接実行が失敗
    Pythonのパスを指定しても、ログに出力がなく、エラー原因が特定できませんでした。

これらの問題は、ロリポップのCron環境が通常のサーバーとは異なる設定を持つため、Pythonやシェルスクリプトの直接実行が難しいことが原因と考えられます。

 

解決策:PHPスクリプトを利用

これらの問題を解決するために、PHPスクリプトを用いてPythonスクリプトを呼び出す方法を採用しました。以下がその手順です:

  1. PHPスクリプトの作成 以下のようなPHPスクリプトを作成します:

     

    <?php
    $pythonScript = '/home/users/1/jinjineer/web/email_sample.py';
    $pythonPath = '/usr/local/bin/python3';
    $command = escapeshellcmd("$pythonPath $pythonScript");
    $output = shell_exec($command);
    file_put_contents('/home/users/1/jinjineer/web/cron_log.txt', $output . PHP_EOL, FILE_APPEND);
    ?>

    このスクリプトは、Pythonスクリプトを実行し、その結果をログファイルに保存します。

  2. CronにPHPスクリプトを登録 ロリポップのCron設定画面で、以下のように登録します:
    run_python.php

    PHPを介して実行することで、Cron環境でも問題なく動作するようになりました。

  3. 結果を確認 実行後、cron_log.txt にPythonスクリプトの実行結果が記録されていることを確認できます。

学びと注意点

  • ロリポップでは、PHPを使ったCron実行が最も安定して動作することが分かりました。
  • Pythonやシェルスクリプトを直接実行するのではなく、PHPスクリプトを介することで、環境依存の問題を回避できます。Pythonが使えない、シェルスクリプトが使えない問題で時間を無駄にしてしまいました。。
  • Cron実行時に利用するPHPのバージョンは、ロリポップの「CGI版」の設定を反映するため、必要に応じてPHPバージョンを設定し直してください。

 

まとめ

ロリポップでのCron設定では、PHPを活用することでPythonスクリプトの定期実行がスムーズに行えました。もし同様の問題で悩んでいる方がいれば、PHP経由での実行をぜひ試してみてください!