Cronjob 没有运行脚本

Cronjob 没有运行脚本

我已经创建了一个脚本来获取我的外部 IP 地址,检查它是否已更改,如果已更改,则通过电子邮件发送给我并告知我。

以下是恰当命名的脚本ip.sh(服务器主机名是“odin”):

#!/bin/sh

# Start by renaming file "current-ip" to "old-ip"
mv -f  /var/www/html/scripts/current-ip  /var/www/html/scripts/old-ip
# Create new "current-ip" with the email's subject line
echo 'Subject: Odin has a new IP address' >> /var/www/html/scripts/current-ip
# Add a blank line
echo '' >> /var/www/html/scripts/current-ip
# Add some text to make the email slightly more readable
echo 'It seems as if a new IP address as been assigned to Odin:' >> /var/www/html/scripts/current-ip
# Get my external IP address and add it to a new line
curl http://ipecho.net/plain -w "\n" >> /var/www/html/scripts/current-ip
# Set permission to make the file readable and writeable
chmod 766 /var/www/html/scripts/current-ip

# Check to see if the newly built "current-ip" matches the old file
if diff /var/www/html/scripts/current-ip /var/www/html/scripts/old-ip >/dev/null ; then
# if it does, do nothing
exit
# Otherwise send that email!
else
  ssmtp -F"Odin" [email protected] < /var/www/html/scripts/current-ip
fi

因此,为了测试这一点,我将 current-ip 文件编辑为其他内容,然后运行脚本./ip.sh,它运行良好,我收到了“Odin”发来的电子邮件,告诉我我的新 IP 地址是什么。太棒了。

所以现在,我创建一个符号链接:

ln /var/www/html/scripts/ip.sh /sbin/odinip

并通过运行进行测试odinip。运行完美。

然后我去创建 cronjobcrontab -e 并输入以下行:

*/5 * * * * /sbin/odinip

我还添加了以下行以确保 cron 正常运行:

*/5 * * * * env > /var/www/html/scripts/env.output

然后我再次编辑该current-ip文件以确保运行 cronjob 时会有所不同。

然后我就等啊等啊等。env.output 文件创建了,但是没有发送电子邮件。

检查系统日志(tail -n25 /var/log/syslog)我得到:

May  9 13:40:01 odin CRON[7371]: (root) CMD (env > /var/www/html/scripts/env.output)
May  9 13:40:04 odin CRON[7341]: (CRON) info (No MTA installed, discarding output)
May  9 13:40:38 odin crontab[7429]: (root) BEGIN EDIT (root)
May  9 13:40:47 odin crontab[7429]: (root) END EDIT (root)
May  9 13:40:49 odin crontab[7451]: (root) BEGIN EDIT (root)
May  9 13:41:01 odin CRON[7478]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:41:16 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:42:46 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:41:30 odin crontab[7451]: (root) END EDIT (root)
May  9 13:41:31 odin crontab[7513]: (root) BEGIN EDIT (root)
May  9 13:41:44 odin crontab[7513]: (root) END EDIT (root)
May  9 13:41:46 odin crontab[7548]: (root) BEGIN EDIT (root)
May  9 13:42:01 odin CRON[7587]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:42:46 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:44:16 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:43:01 odin CRON[7690]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:43:41 odin crontab[7548]: (root) REPLACE (root)
May  9 13:43:41 odin crontab[7548]: (root) END EDIT (root)
May  9 13:44:01 odin cron[360]: (root) RELOAD (crontabs/root)
May  9 13:44:01 odin CRON[7771]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:44:18 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:45:48 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:45:01 odin CRON[7849]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:45:01 odin CRON[7850]: (root) CMD (/home/jim/duckdns/duck.sh >/dev/null 2>&1)
May  9 13:45:01 odin CRON[7851]: (root) CMD (/sbin/odinip)
May  9 13:45:04 odin CRON[7829]: (CRON) info (No MTA installed, discarding output)
May  9 13:45:51 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:47:21 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:46:01 odin CRON[7943]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)

cpuTemp.sh只是我在那里运行的另一个脚本。也许与没有邮件传输代理有关?但是当我手动运行它时它如何工作?

更多信息:所有命令都以 root 身份运行、文件编辑和 crontab 编辑。所有这些都发生在运行 Jessie 的 Rasberry Pi 2 上。最近进行了更新和升级。

答案1

哇哦。答案是:使用完整路径

我以为我已经这样做了,直到我发现其他人在直接从 crontab 使用 ssmtp 时遇到了问题。

他们有:

0 9 * * * ssmtp [email protected] < /home/a/a-msg.txt

并不得不将其改为

0 9 * * * /usr/sbin/ssmtp [email protected] < /home/a/a-msg.txt

这显然解决了这个问题。

另一方面,我从 bash 脚本 ( ip.sh) 中引用了 ssmtp,其中有以下行:

ssmtp -F"Odin" [email protected] < /var/www/html/scripts/current-ip

所以我将其更新为

/usr/sbin/ssmtp -F"Odin" [email protected] < /var/www/html/scripts/current-ip

更改了 current-ip 内容以强制else触发 if 语句,这似乎有效。我将继续测试,如果发现任何其他错误,我会更新它。

答案2

Cron 在执行命令时不会使用或记住您的环境,因此路径和其他环境变量可能不像您预期​​的那样。

正如您已经发现的那样,避免问题的最佳方法是始终使用从 cron 执行的命令的完整路径。

相关内容