質問
cronジョブで次のスクリプトを実行しています...
cd /etc/parselog/
php run_all.php >/dev/null
次のエラーが表示されます:
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './mysqli.so' - ./mysqli.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './odbc.so' - ./odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo_mysql.so' - ./pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo_odbc.so' - ./pdo_odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo_sqlite.so' - ./pdo_sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Fatal error: Call to undefined function mysql_connect() in /etc/parselog/stats_downloads.php on line 5
ただし、コマンドラインから同じスクリプトを実行してログインすると、エラーなしで完全に機能します。
これはプロンプトでの私の$ PATH文字列です:
$PATH = /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
アイデアや提案はありますか? cronjobを実行するとき、libパスまたは何かが含まれていないことは確かです。正確なパスを追加してみました
解決
ヒント1:cronジョブにまったく同じ$ PATHがあることを確認します。
cd /etc/parselog/
export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
php run_all.php >/dev/null
ヒント2:他のすべての環境変数も一致することを確認します。コマンド env
を使用して環境をダンプし、対応するエクスポートをcronジョブに追加します。
他のヒント
一般に、cronの実行中に何かが失敗したが、コマンドラインで実行される場合、その権限、作業ディレクトリ、または環境変数です。
php実行可能ファイル自体がライブラリをロードしていないようです。問題はスクリプトにない可能性があります。
cronジョブでスクリプトを実行すると、環境変数がほとんど設定されていない限られたシェルで実行されます。あなたのエラーから、エラーが多くの共有ライブラリに関係するように設定する必要があるのはLD_LIBRARY_PATHのように見えますが、それは単なる推測です。 PHPの適切なライブラリパスがcronスクリプトで正しく設定されていないようです。
env コマンドをスクリプトに追加して出力をキャプチャすることにより、cronスクリプトの実行時に使用される環境をキャプチャできます。これをプロンプトでの env 出力と比較して、バリエーションを探します。ほとんどの場合、ライブラリをセットアップするローカルまたはシステムの profile または bashrc (または .login )ファイルで発行されたコマンドからのものです。パス。 PHPに関連するパスと変数を特に探す必要があります。それはあなたの問題のようです。
前回のプロジェクトでこの問題に何度か対処する必要がありましたが、基本的な解決策は次のとおりです:
- スクリプトの実行に必要な最小環境を決定する
- 目的の環境をセットアップする短いスクリプトを作成します
- 環境を適切に設定するために、アプリケーションを起動するスクリプトの項目2からスクリプトへの呼び出しを追加します。
- 完全にテストして、見逃していないことを確認します:-)。
cronジョブがユーザーのcrontabから実行されると、そのユーザーとして実行されます。ただし、ユーザーのホームディレクトリにある.profile、.cshrc、.bashrcなどのファイルやその他のファイルは取得しません。スクリプトが必要とするファイルのソース(読み取り)にcronが必要な場合は、cronが呼び出しているスクリプトから実行する必要があります。パスの設定、ファイルのソース、環境変数の設定など