3

cronjob で次のスクリプトを実行しています...

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 パスまたは何かが含まれていないことは確かです。正確なパスを追加してみました

4

4 に答える 4

5

ヒント 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 ジョブに追加します。

于 2009-05-05T19:35:56.117 に答える
3

通常、cron 中に何かが失敗し、コマンド ラインで実行される場合、それはアクセス許可、作業ディレクトリ、または環境変数です。

PHP 実行可能ファイル自体がライブラリをロードしていないようです。問題はスクリプトにない可能性があります。

于 2009-05-05T19:36:57.487 に答える
1

cron ジョブでスクリプトを実行すると、環境変数がほとんど設定されていない制限付きシェルで実行されます。あなたのエラーから、エラーが一連の共有ライブラリに関連するため、設定する必要があるのは LD_LIBRARY_PATH である可能性があるように見えますが、それは単なる推測です。cron スクリプトで PHP の適切なライブラリ パスが正しく設定されていないようです。

envコマンドをスクリプトに追加して出力をキャプチャすることにより、cron スクリプトの実行時に使用される環境をキャプチャできます。これをプロンプトのenv出力と比較し、バリエーションを探します。ほとんどの場合、ローカルまたはシステムプロファイル、またはライブラリ パスを設定するbashrc (または.login ) ファイルで発行されたコマンドからのものです。PHPに関連するパスと変数を特に探します。それがあなたの問題のようです。

前回のプロジェクトでこの問題に何度か対処する必要がありましたが、基本的な解決策は次のとおりです。

  1. スクリプトの実行に必要な最小限の環境を決定する
  2. 目的の環境を設定する短いスクリプトを作成します
  3. 環境が適切に設定されるように、アプリケーションを起動するスクリプトの項目 2 からスクリプトへの呼び出しを追加します。
  4. 徹底的にテストして、何も見逃していないことを確認してください:-)。
于 2009-05-06T17:19:07.840 に答える
0

cronジョブがユーザーcrontabから実行されると、そのユーザーとして実行されます。ただし、.profile、.cshrc、.bashrcなどのユーザーのホームディレクトリ内のファイルやその他のファイルはソースされません。スクリプトに必要なファイルをソース(読み取り)するためにcronが必要な場合は、cronが呼び出しているスクリプトから実行する必要があります。パスの設定、ファイルのソーシング、環境変数の設定など。

于 2011-05-03T16:40:48.057 に答える