发送电子邮件和通知发送在crontab中不起作用

时间:2019-02-11 20:52:22

标签: linux bash shell cron

我配置了crontab以便发送电子邮件和显示桌面通知。在以下脚本之后:

#!/bin/sh

ls /home/anis > /tmp/log.log
echo "---------------------$1-------------------" >> /tmp/log.log


info_and_email()
{
    logtime=`date "+%Y/%m/%d %H:%M:%S"`
    notify-send "$1"
    echo "To:myemail@domain.com" > /tmp/report.txt
    echo "From:anysrc@domain.com" >> /tmp/report.txt
    echo "Subject: ------$1----- ($logtime)"  >> /tmp/report.txt
    ssmtp myemail@domain.com < /tmp/report.txt
}

info_and_email "$1"

如果我从CLI运行脚本,则脚本会成功执行,并显示通知并发送电子邮件,但是如果脚本是从crontab执行的,则可以看到该脚本使用ps运行,但是没有发送电子邮件,也没有显示通知。

我想念什么?

2 个答案:

答案 0 :(得分:2)

以cron身份运行时,您没有设置任何环境。甚至没有路径。因此它可能找不到通知发送或ssmtp。

要么在脚本的开头添加PATH,要么为您发出的命令指定完全限定的路径名​​。

答案 1 :(得分:0)

您的第一步应该是检查您的电子邮件。如果您的脚本命令中的任何命令打印了任何内容,尤其是错误,则cron会将所有输出通过电子邮件发送给crontab的所有者。 (如果需要,可以通过将xyz添加到crontab中来将该邮件重定向到用户MAILTO=xyz。)

要更好地了解实际运行情况,请将脚本的第一行更改为:

#!/bin/bash -x

这会打开bash的 trace模式,该模式向您显示正在执行的每个命令。如上所述,当您的脚本由cron运行时,该执行跟踪日志将通过电子邮件发送出去。

最后,请注意,所有cron作业都在有限的环境下运行。 man 5 crontab,以查看哪些环境变量被设置为什么值,并假设没有其他设置。 (这在您使用的至少一种实用程序中起着至关重要的作用。)

现在,转到特定实用程序:


notify-send使用D-Bus消息系统将通知请求发送到您的桌面。这要求它知道如何连接到D-Bus,er, bus ,这是通过特定的环境变量完成的:

$ env | grep DBUS
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

当然,该变量在普通cron环境中不存在,因此请在您的系统上运行上述命令,然后将该DBUS_SESSION_BUS_ADDRESS=...行复制到您的crontab中。这样会将正确的DBUS_SESSION_BUS_ADDRESS设置添加到您所有cron作业的环境中。


我没有使用ssmtp的经验,但是the man page说它有详细的(-v)模式,所以称呼它为

ssmtp -v myemail@domain.com < /tmp/report.txt

在您的脚本中,然后查看其内容。