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


170

当我从命令行运行它时,我有一个可以运行的脚本,但是当我对其进行计划时,却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 XXXXX@gmail.com < 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,但是我可以作为用户。我缺少什么让它正常工作?

Answers:


158

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

@Giles-谢谢,请cron拥有它,PATH还是可以检查我用户的PATH?我设置ssmtp也达有它自己userwheel允许认为它会允许任何人使用它(包括的cron)。如果它对CENTOS 6.2上的即时消息有帮助,
ProfessionalAmateur

3
@ProfessionalAmateur您的问题不是您不被允许使用ssmtp,而是您的cron作业找不到任何被调用的可执行文件,ssmtp因为它不在您的中PATH。没有“您的用户PATH” 之类的东西;这是每个进程的设置,而不是每个用户的设置。您可以通过PATH=…在crontab中放置一行来设置所有cron作业的路径。
吉尔斯

我还必须添加MAILTO='XXXX@gmail.com'才能使其与PATH设置一起使用。奇怪,但对我有用。
mac

对于ssmtp,可以使用;´which ssmtp´ ...
弗雷德里克·高斯


20

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

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

14

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

但是,您需要考虑到这些作业将在非交互式shell中运行,这意味着$ PATH可能与从命令行运行脚本时的$ 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

7

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

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

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


3

检查线程,如何轻松找出cron的环境,它比您在交互式shell中所使用的环境要少得多。最好是假设没有任何设置,然后自己明确设置。


1

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

采用@Kusalananda极好的评论。


1
否。这取决于系统保留主目录的位置。/home远非普遍。
库萨兰达

1
@Kusalananda LSB标准说/home
彼得

1
@peterh好吧,macOS使用/Users和历史Unices使用/usr,甚至在Linux上,系统用户的主目录也可能在下面/var或其他地方。
库萨兰达

1
@Kusalananda是的。
彼得

谢谢你,你实际上回答了这个问题:)唯一的人
自己

0

有人暗示或链接了它,但是找出最佳方法是因为我无法在发行版的man文档中找到它,只需将其添加到cron中

* * * * * echo $PATH > /tmp/lolcronjobs

在我的情况下,ubuntu默认使用only,/usr/bin:/bin这会引起一些问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.