代码之家  ›  专栏  ›  技术社区  ›  MOHAMED

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

  •  -1
  • MOHAMED  · 技术社区  · 6 年前

    我配置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 回复  |  直到 6 年前
        1
  •  2
  •   JimR    6 年前

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

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

        2
  •  0
  •   Adrian    6 年前

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

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

    #!/bin/bash -x
    

    打开巴什的 跟踪模式 ,显示正在执行的每个命令。如上所述,当脚本由 克朗 ,该执行跟踪日志将通过电子邮件发送。

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

    现在,对于特定的实用程序:


    notify-send 使用 D-Bus 向桌面发送通知请求的消息系统。这就要求它知道如何连接到D总线,呃, 公共汽车 ,这是通过一个特定的环境变量完成的:

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

    当然,这个变量不存在于股票中 克朗 环境,所以在您的系统上运行上述命令,然后复制 DBUS_SESSION_BUS_ADDRESS=... 行到crontab。加上正确的 DBUS_SESSION_BUS_ADDRESS 设置为所有cron jobs的环境。


    我没有经验 ssmtp 但是 the man page 说它有一个详细的( -v )模式,所以称之为:

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

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