脚本通常可以工作,但不能与 cron 一起使用

脚本通常可以工作,但不能与 cron 一起使用

我有一个如下所示的脚本:

#!/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

相关内容