尽管 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 脚本中。