【问题标题】:PHP Errors on a cronjob, works fine at promptcronjob 上的 PHP 错误,提示时工作正常
【发布时间】:2009-05-05 19:31:21
【问题描述】:

我正在 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 路径或包含的内容。我什至尝试添加确切的路径

【问题讨论】:

    标签: php linux cron


    【解决方案1】:

    提示 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 作业中。

    【讨论】:

    • 好吧,我得到了导出路径,我想我在导出的 PATH 前面有一个 $。我的环境是:HOSTNAME=***** TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=70.48.253.46 61056 22 OLDPWD=/etc SSH_TTY=/dev/pts/0 USER=root MAIL=/var/假脱机/邮件/根 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin :/usr/X11R6/bin:/root/bin INPUTRC=/etc/inputrc PWD=/etc/cron.hourly SHLVL=1 HOME=/root LOGNAME=root LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES =1 _=/bin/env
    • 所以看起来好像没有我遗漏的重要环境变量。
    • 能否修改问题,使其包含最新的 cron 作业?
    【解决方案2】:

    通常当某些事情在 cron 期间失败但在命令行上运行时,它是权限、工作目录或环境变量。

    看起来 php 可执行文件本身没有加载库,问题可能不在您的脚本中。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2014-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-21
          • 1970-01-01
          • 2013-12-04
          • 2019-02-16
          • 2012-04-24
          相关资源
          最近更新 更多