我正在尝试设置一个 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 字符,没有不可分割的空格或非打印字符。另外,请检查您是否没有定义一些可能导致问题的环境变量,例如PATH
或LD_LIBRARY_PATH
。
如果/usr/bin/env: No such file or directory
强烈表明服务器上存在您无法修复的错误配置。服务器上的虚拟环境或安全框架不允许您运行命令,至少从 cron 是如此。如果不知道服务器运行的环境类型,就不可能知道可能出现什么问题。这是系统管理员必须解决的问题。
该setlocale
错误不是问题的原因,但很可能是另一种症状。