为什么 cron 作业找不到基本的 Linux 命令?

为什么 cron 作业找不到基本的 Linux 命令?

我正在尝试设置一个 cron 作业来每天运行 PHP 脚本,作为基于 Web 的预订系统的一部分。它已经在不同的 Apache 服务器上完美运行了好几年,在 crontab 中使用此命令:

0 3 * * * wget -q -O /dev/null http://www.my_other_domain.org.uk/scheduled/my_script.php

我刚刚在另一台 Apache 服务器上安装了该脚本,并且通过浏览器调用时它可以正确运行。但是,当我尝试使用 cron 时,cron 守护进程会给出以下消息:

-: warning: setlocale: LC_ALL: cannot change locale (en_GB.utf-8)
-: wget: command not found

当我尝试时

0 3 * * * /usr/bin/env wget -q -O /dev/null http://www.mydomain.org.uk/scheduled/my_script.php

我收到消息:

-: warning: setlocale: LC_ALL: cannot change locale (en_GB.utf-8)
-: /usr/bin/env: No such file or directory

首先,我是否正确假设 setlocale 警告与问题无关?

我也尝试过

0 3 * * * /usr/bin/php /var/www/vhosts/mydomain/httpdocs/scheduled/my_script.php

这使

-: /usr/bin/php: No such file or directory

我还尝试将 shebang 作为脚本的第一行,并让 cron 使用完整路径调用它。 cron 守护进程报告没有 /[full_path]/my_script.php 这样的文件或目录。

尝试使用curl也好不到哪儿去。

我没有对服务器的 shell 访问权限,并且我一直通过 Plesk 控制面板设置 cron 作业。 cron 作业似乎正在按计划运行。系统管理员为我做了以下操作:

#which php
/usr/bin/php

#which wget
/usr/bin/wget

#which curl
/usr/bin/curl

这似乎证实了命令位于正确的位置。

以上是一个简短的历史记录 - 我已经记不清我尝试过的排列和组合了,这主要是阅读本论坛和其他论坛中的建议的结果。

谁能告诉我为什么 cron 作业无法找到命令并提出解决方案?

答案1

PATH您的 shell 通过查看由您的环境设置的 来知道在哪里查找可执行文件。cron不共享相同的环境。将其添加到 crontab 的顶部应该告诉它在哪里可以找到您期望的命令:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

答案2

根据您报告的症状,这超出了损坏的范围PATH:这不会影响/usr/bin/env。然而,很难确定,因为您的报告不一致。你写的/usr/bin/env是还是usr/bin/env

确保 crontab 中只有 ASCII 字符,没有不可分割的空格或非打印字符。另外,请检查您是否没有定义一些可能导致问题的环境变量,例如PATHLD_LIBRARY_PATH

如果/usr/bin/env: No such file or directory强烈表明服务器上存在您无法修复的错误配置。服务器上的虚拟环境或安全框架不允许您运行命令,至少从 cron 是如此。如果不知道服务器运行的环境类型,就不可能知道可能出现什么问题。这是系统管理员必须解决的问题。

setlocale错误不是问题的原因,但很可能是另一种症状。

相关内容