cron 执行作业时的“工作目录”是什么?

Pro*_*eur 217 cron directory path cd-command

我有一个脚本,当我从命令行运行它时cron,它可以工作,但是当我用它来安排它时,我收到了找不到文件或命令的错误。我的问题是双重的:

  1. 当我使用 调度 cron 作业时crontab -e,它是否使用我的用户 ID 作为其权限的基础?或者它是否使用某种类型的 cron 用户 ID 及其相关权限?

  2. 启动 cron 作业时,工作目录是什么?它是我指定要运行的脚本的目录,还是其他目录?

这是我的 cron 工作:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
Run Code Online (Sandbox Code Playgroud)

这是实际的脚本:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp XXXXX@gmail.com < emailmsg.txt
Run Code Online (Sandbox Code Playgroud)

以下是我在查看由mail产生的消息时得到的错误cron

sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found
Run Code Online (Sandbox Code Playgroud)

它找不到,template.txt但它与脚本位于同一目录中。它也不能运行ssmtp,但我可以作为我的用户。我缺少什么才能使其正常工作?

Gil*_*il' 207

cd /home/xxxx/Documents/Scripts/如果您希望您的作业在该目录中运行,请添加。cron 没有理由更改到该特定目录。Cron 在您的主目录中运行您的命令。

至于ssmtp,它可能不在您的默认值中PATH。克龙的默认路径是实现相关的,所以检查你的手册页,但十有八九ssmtp/usr/sbin这是不是在你的默认PATH,只有root的。

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh
Run Code Online (Sandbox Code Playgroud)

  • @ProfessionalAmateur 你的问题不在于你不能使用 `ssmtp`,而是你的 cron 作业没有找到任何名为 `ssmtp` 的可执行文件,因为它不在你的 `PATH` 中。没有“你的用户的`PATH`”这样的东西;这是每个进程的设置,而不是每个用户的设置。您可以通过在 crontab 中放置 `PATH=...` 行来设置所有 cron 作业的路径。 (5认同)

小智 35

如果您的 cronjob 是 bash 脚本,以下内容将 CD 到您的脚本位置(假设您在 cron 定义中使用绝对路径):

cd "$(dirname "$0")";
Run Code Online (Sandbox Code Playgroud)


Bra*_*ram 17

回答问题 1:如果您crontab -e以自己的用户身份运行,作业将被安排在该用户的 crontab 中,因此将以该用户的权限运行。

但是您需要考虑到作业将在非交互式 shell 中运行,这意味着 $PATH 可能与从命令行运行脚本时的不同。

最好总是在脚本中使用完整路径,特别是如果您打算通过 at/cron 等来安排它们。

我还建议使用所有文件的完整路径,以避免出现您看到的问题。

为了防止竞争条件和其他安全问题,您还应该使用mktemp确保您读取的文件不会被脚本之外的任何内容修改。

因此,我会将脚本更改为:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg
Run Code Online (Sandbox Code Playgroud)


D_B*_*Bye 8

cron以该用户身份运行每个用户的计划作业。这应该足以让我们确定它相对于您的主目录运行您的脚本。

如果您需要它从不同的位置运行,只需cd在脚本中使用即可转到该位置。

ssmtp可能不在cron的默认 PATH 中(在大多数平台上它被设计为非常窄)。您可以ssmtp在脚本中指定完整路径,也可以在 a) 您的 crontab 文件中显式设置 PATH,该文件可用于所有脚本,或 b) 在每个脚本中。


小智 5

cron执行作业的默认工作目录是主目录,通常是/home/your-user-name.