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 作业中运行脚本时,它会在有限的 shell 中运行,并且设置的环境变量非常少。从您的错误来看,可能需要将 LD_LIBRARY_PATH 设置为与一堆共享库有关的错误,但这只是一个猜测。看起来在 cron 脚本中没有正确设置 PHP 的正确库路径。

您可以通过将env命令添加到脚本并捕获输出来捕获运行 cron 脚本时使用的环境。将此与提示符处的env输出进行比较并查找变化。它们很可能来自您的本地或系统配置文件或设置库路径的bashrc(甚至可能是.login )文件中发出的命令。我会专门寻找与 PHP 相关的路径和变量,因为这似乎是您的问题。

在我的上一个项目中,我不得不多次处理这个问题,基本的解决方案是:

  1. 确定执行脚本所需的最低环境
  2. 创建一个简短的脚本来设置所需的环境
  3. 在启动应用程序的脚本中添加对第 2 项脚本的调用,以便正确设置环境。
  4. 彻底测试以确保您没有遗漏任何东西:-)。
于 2009-05-06T17:19:07.840 回答
0

当从用户 crontab 运行 cron 作业时,它将作为该用户执行。但是,它不会获取用户主目录中的任何文件,例如他们的 .profile、.cshrc 或 .bashrc 或任何其他文件。如果您需要 cron 来获取(读取)脚本所需的任何文件,您应该从 cron 正在调用的脚本中执行此操作。设置路径、源文件、设置环境变量等。

于 2011-05-03T16:40:48.057 回答