我在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路径或包含的东西。我甚至尝试添加确切的路径

有帮助吗?

解决方案

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top