【问题标题】:send email and notify-send do not work in crontab发送电子邮件和通知发送在 crontab 中不起作用
【发布时间】:2019-02-12 10:37:25
【问题描述】:

我配置了 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 运行,但未发送电子邮件且未显示通知。

我错过了什么?

【问题讨论】:

  • 运行which ssmtp并复制ssmtp或type -P ssmtp的绝对路径

标签: linux bash shell cron


【解决方案1】:

当作为 cron 运行时,您没有设置任何环境。甚至没有路径。所以它可能找不到 notify-send 或 ssmtp。

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

【讨论】:

  • 当作为 cron 运行时,您没有设置任何环境。甚至没有 PATH。 不。我曾经使用过的所有 crons 都至少设置为PATH=/usr/bin:/bin。如果notify-send 和ssmtp 是从发行版包安装的(很可能),OP 的脚本会发现它们很好。更正确的说法是“cron 设置了一个 limited 环境”。 man 5 crontab 看看它包含什么。
【解决方案2】:

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

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

#!/bin/bash -x

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

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

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


notify-send 使用D-Bus 消息系统将通知请求发送到您的桌面。这就要求它知道如何连接到 D-Bus,呃,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

在你的脚本中,看看它告诉你什么。

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多