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

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

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

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

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

这是我的 cron 工作:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh

这是实际的脚本:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp [email protected] < emailmsg.txt

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

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

答案1

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

至于说ssmtp,它可能不是你的默认值PATH。 Cron 的默认路径取决于实现,因此请检查您的手册页,但很可能ssmtpin /usr/sbinwhich 不在您的默认路径中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

答案2

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

cd "$(dirname "$0")";

答案3

回答问题 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 [email protected] < $mailmsg
/bin/rm $mailmsg

答案4

有些人已经暗示或链接了它,但由于我在我的发行版的 man 文档中找不到它,所以最好的找出方法就是将其添加到 cron 中

* * * * * echo "$PWD" > /tmp/lolcronjobs

然后 cat out lolcronjobs 看看你的工作目录是什么。查找 $PATH 和其他环境变量也是如此。

相关内容