我配置了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
运行,但是没有发送电子邮件,也没有显示通知。
我想念什么?
答案 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
在您的脚本中,然后查看其内容。