cron 会在 PATH 上找到某些命令,但不会找到其他命令

cron 会在 PATH 上找到某些命令,但不会找到其他命令

尽管 PATH 和 SHELL 设置正确,但 crontab 运行某些命令时出现问题。

这是机器的环境:

SHELL=/bin/bash
USER=ubuntu
MAIL=/var/mail/ubuntu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/gopath/bin

这是 cron 的环境(看起来相同):

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/gopath/bin
PWD=/home/ubuntu

然后,在 crontab 中:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/gopath/bin
SHELL=/bin/bash
*/1 * * * * "whoami"
*/1 * * * * "whoami && which whoami"

第一个whoami任务成功,但第二个任务失败,并显示:

/bin/bash: whoami && which whoami: command not found

因为which没有找到。然而,这很奇怪:

$ which whoami
/usr/bin/whoami

$ which which
/usr/bin/which

并且/usr/bin位于 cron 的 PATH 中。是什么赋予了?

答案1

您不应该引用 cron 作业。

你有

*/1 * * * * "whoami && which whoami"

这是一个字面上称为 的命令whoami && which whoami。例如/usr/bin/whoami && which whoami。显然,这个命令不存在。删除引号以便正确解释该命令:

*/1 * * * * whoami && which whoami

答案2

一般来说,如果你想在一个 cron 任务中运行多个命令,你确实应该将它们放在一个脚本中。

您不应该像这样在声明中添加双引号。它可能被视为文字。如果您确实打算内联运行它们,您可以执行以下操作:bash -c 'whoami && which whoami'

但同样,此时您确实应该将命令放入 shell 脚本中。

相关内容