我有一个如下所示的脚本:
#!/bin/bash
D=~/brew\ update
num=$(ls "$D" | cut -d ' ' -f 2 | sort -nr | head -1)
num=$(( num + 1 ))
script -q "$D/brew_update $num" brew update
这个脚本总是有效的,但是当我用 cron 启动它时0 */5 * * * ~/bin/brewupdate2
,它在一个文件中说了这一点/var/mail
^Dscript: brew: No such file or directory
所以我以为是它使用了sh
,但我尝试了一下sh ~/bin/brewupdate2
,它运行没有错误。
答案1
D=~/brew\ update
# the above will never work unless you start script as you
# say you are user fred, this full path will always work
D=/home/fred/brew\ update
Cron 使用与用户不同的权限和路径,换句话说,cron 基本上是它自己的用户(root),有它自己的 PATH 等。不要使用 ~/,它指的是另一个主目录,而不是你的,当 cron 启动时job,~/ 相对于启动该作业的系统中的用户的主目录(在本例中为 root)。使用“brew update”的完整路径(如果可以的话,删除该目录名及其中的空格,如果它在您的控制之下)。我不知道 cron 甚至在生成路径方面对 ~/ 做了什么,因为它永远不会按预期工作,所以我从未考虑过这一点。
使用 cron 时,始终使用完整的系统路径,否则您将收到此类错误。
从服务器故障:
[cron]将以什么用户身份运行?
它们都以 root 身份运行。如果您需要其他方式,请在脚本中使用 su 或将 crontab 条目添加到用户的 crontab (man crontab) 或系统范围的 crontab(在 CentOS 上我无法告诉您其位置)。
因此,理论上,您可以使用 ~/ 它将转换为 root 的主目录 /root/,但这对于重新可读性和测试等来说是一个非常糟糕的主意。
[更新]如上所述,这里的问题是“brew”位于 /usr/local/bin 中,而它不在 cron 的 $PATH 中,这使得命令“brew”失败,找不到文件。我错过了最后一行。但更有理由始终使用完整路径。所有程序和文件的完整路径将解决所有这些问题。
答案2
正如 @Lizardx 的答案中提到的,PATH
环境变量可能与您的用户帐户的环境变量不同。您看到的错误表明script
无法找到该命令brew
:
brew: No such file or directory
纠正错误的最简单方法是指定输入命令的确切路径script
:
script -q "$D/brew_update $num" /usr/local/bin/brew update