当我从命令行运行它时,我有一个可以运行的脚本,但是当我用cron对其进行计划时,出现了无法找到文件或命令的错误。我的问题是双重的:


当我使用crontab -e计划cron作业时,它是否使用我的用户ID作为其权限的基础?还是使用某种cron用户ID及其相关权限?
启动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,但是我可以作为用户。我缺少什么让它正常工作?

#1 楼

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

对于ssmtp,它可能不在默认PATH中。 Cron的默认路径依赖于实现,因此请检查您的手册页,但极有可能ssmtp位于/usr/sbin中,而PATH不在默认的q4312079q中,而只有root所在。

评论


@Giles-谢谢,cron是否拥有自己的PATH或我可以检查用户的PATH?我将ssmtp设置为拥有自己的用户和权限,认为它可以允许任何人使用它(包括cron)。如果它有助于CENTOS 6.2上的即时消息

–ProfessionalAmateur
2012年5月18日在15:51

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

–吉尔斯'所以-不再是邪恶的'
2012年5月19日上午8:45

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

–mac
2014年6月8日,9:56

对于ssmtp,可以使用; ‘哪个ssmtp’...

–弗雷德里克·高斯(Fredrick Gauss)
17年11月9日在10:40



@FredrickGauss使类型为ssmtp

–吉尔斯'所以-不再是邪恶的'
17年11月9日在21:54

#2 楼

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

cd "$(dirname "q4312078q")";


#3 楼

要回答问题1:如果您以自己的用户身份运行crontab -e,则作业将在该用户的crontab中安排,因此将在该用户的权限下运行。在非交互式外壳中运行,这意味着$ 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


#4 楼

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

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

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

#5 楼

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

#6 楼

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

#7 楼

有人暗示或链接了它,但是找出最好的方法是因为我无法在发行版的man文档中找到它,所以只需将其添加到cron中。只能使用/usr/bin:/bin导致了一些问题。