繁体   English   中英

在cron中运行bash脚本

[英]Running bash script in cron

我有以下bash脚本:

!/bin/bash
# script to send simple email 
#Wait 5 seconds
#sleep 05
# email subject
SUBJECT="SUBJECT"
# Email To ?
EMAIL="EMAIL"
# Email text/message
MYIP=$(curl http://ipecho.net/plain)
LASTIP=$(head -n 1 /home/ubuntu/myip.txt)
echo "Last IP:" $LASTIP
echo "Current IP:" $MYIP
#Check if IPs are the same
if [[ "$MYIP" == "$LASTIP" ]]; then
        echo "IP hasn't changed. Do nothing."
else
        sendemail -f $EMAIL -t $EMAIL -u $SUBJECT -m $MYIP -s smtp.gmail.com -o tls=yes -xu username -xp password
        echo $MYIP > myip.txt
fi

当我尝试在命令行中运行它时,它可以完美运行。 当我像这样在“ crontab -e”中包含它时,问题就开始了:“ * * * * * /home/ubuntu/myip.sh”。

然后它不起作用。 似乎sendmail无法正常运行。 当我这样做时:tail -f / var / log / syslog

Sep 18 21:48:02 gpuserver sendmail[18665]: r8J1m1gO018665: from=ubuntu, size=314, class=0, nrcpts=1, msgid=<201309190148.r8J1m1gO018665@gpuserver>, relay=ubuntu@localhost
Sep 18 21:48:02 gpuserver sendmail[18665]: r8J1m1gO018665: to=ubuntu, ctladdr=ubuntu (1000/1000), delay=00:00:01, xdelay=00:00:00, mailer=relay, pri=30314, relay=[127.0.0.1] [127.0.0.1], dsn=4.0.0, stat=Deferred: Connection refused by [127.0.0.1]

有任何想法吗?

从命令行运行脚本时,您正在利用当前环境。 Cron没有该信息。因此,您应该从命令行执行以下操作:

env > me

然后编辑脚本,并在脚本开头包含./me。 这样,您的cron任务将在相同的环境下运行。

当cron打印一些东西到stdout或stderr时,cron本身会尝试通过电子邮件发送报告。 由于您可能没有配置系统范围的电子邮件,因此这可能是syslog中错误消息的来源。

为了防止cron发送任何邮件,请确保您的脚本及其产生的任何命令均不会向stdout或stderr输出任何内容。 一种简单的方法是在您的cron行中添加“&> / dev / null”。

您还可以在crontab的开头添加“ MAILTO =“”。

这些全部记录在cron / crontab的手册页中(man -k cron)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM