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

use*_*706 5 cron

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

0 3 * * * wget -q -O /dev/null http://www.my_other_domain.org.uk/scheduled/my_script.php
Run Code Online (Sandbox Code Playgroud)

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

-: warning: setlocale: LC_ALL: cannot change locale (en_GB.utf-8)
-: wget: command not found
Run Code Online (Sandbox Code Playgroud)

当我尝试

0 3 * * * /usr/bin/env wget -q -O /dev/null http://www.mydomain.org.uk/scheduled/my_script.php
Run Code Online (Sandbox Code Playgroud)

我收到消息:

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

首先,我假设 setlocale 警告与问题无关吗?

我也试过

0 3 * * * /usr/bin/php /var/www/vhosts/mydomain/httpdocs/scheduled/my_script.php
Run Code Online (Sandbox Code Playgroud)

这使

-: /usr/bin/php: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我还尝试将 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
Run Code Online (Sandbox Code Playgroud)

这似乎确认命令位于正确的位置。

以上是一个简短的历史 - 我已经忘记了我尝试过的排列和组合,主要是由于阅读了这个论坛和其他论坛的建议。

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

Chr*_*own 14

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

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)

  • +1 -- `cron` 无法找到人们期望它几乎总是归结为 `$PATH` 问题的命令。如果你愿意,试试像 `* * * * * echo $PATH` 这样的 cron 条目 (5认同)