【问题标题】:Using ssmtp in linux script with cron在带有 cron 的 linux 脚本中使用 ssmtp
【发布时间】:2015-04-27 15:25:07
【问题描述】:

我创建了以下 linux 脚本:

#!/bin/sh

tempfront=27
tempreartop=60
temprearbottom=65


if [ "$tempfront" -gt 26 ] || [ "$tempreartop" -gt 70 ] || [ "$temprearbottom" -gt 70 ]; then

echo "To: myemail@mail.com
From: myotheremail@gmail.com
Subject: Test Alert

ALERT
Front temp: $tempfront oC
Back temp up: $tempreartop oC
Back temp down: $temprearbottom oC" > /home/odroid/alerts.txt

ssmtp myemail@mail.com < /home/odroid/alerts.txt

fi

我手动执行此脚本并且工作正常,它将电子邮件警报发送到 myemail@mail.com。以下是 gmail 发送的内容:

    Return-Path: <myotheremail@gmail.com>
    Received: from myotheremail@gmail.com
 (ppp046177171064.abcs.fe. [xx.xx.xx.xx])
            by mx.google.com with ESMTPSA id k2sm8590878wix.4.2015.04.26.12.54.57
            for <myemail@mail.com>
            (version=TLSv1 cipher=RC4-SHA bits=128/128);
            Sun, 26 Apr 2015 12:54:59 -0700 (PDT)
    Message-ID: <d04e@mx.google.com>
    Received: by myotheremail@gmail.com (sSMTP sendmail emulation); Sun, 26 Apr 2015 22:54:56 +0300
    Date: Sun, 26 Apr 2015 22:54:56 +0300
    To: myemail@mail.com
    From: myotheremail@gmail.com
    Subject: Test Alert

    ALERT
    Front temp: 27 oC
    Back temp up: 60 oC
    Back temp down: 65 oC

但是当我将它设置为在 cron 作业中运行时,电子邮件会像这样损坏:

.....
From: root <myotheremail@gmail.com>
X-Google-Original-From: root (Cron Daemon)
Received: by myotheremail@gmail.com (sSMTP sendmail emulation); Sun, 26 Apr 2015 23:00:01 +0300
Date: Sun, 26 Apr 2015 23:00:01 +0300
To: root
Subject: Cron <root@odroid> /home/odroid/testalert.sh >/dev/null
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>

/home/odroid/testalert.sh: 19: /home/odroid/testalert.sh: ssmtp: not found

而且 myemail@mail.com 也没有收到它。 有人可以解释一下吗?为什么 cron 搞砸了?

更新: 我注意到其他一些 cron 作业也输出到电子邮件!

...
Date: Mon, 27 Apr 2015 06:30:01 +0300
From: Cron Daemon <myotheremail@gmail.com>
To: root
Subject: Cron <root@odroid> /home/odroid/motion_day.sh >/dev/null
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>

[0] Processing thread 0 - config file /etc/motion/motion.conf
[0] Motion 3.2.12 Started
[0] Motion going to daemon mode

这只是一个用于网络摄像头监控的脚本,与电子邮件无关! cron 条目是

30 6 * * * /home/odroid/motion_day.sh >/dev/null

【问题讨论】:

  • 另外,你有没有使用 which ssmtp 来找到推荐的完整路径?在我的 Raspberry Pi 上,它告诉我它是 /usr/sbin/ssmtp
  • 你检查过 cron 中可用的 $PATH 吗?为了找出答案,我在 cron 中运行了这个:echo $PATH | /usr/sbin/ssmtp myusername@gmail.com
  • 我在接受的答案中看到@mata 找到了路径 - 非常聪明。

标签: linux cron


【解决方案1】:

Cron 不会在这里搞砸任何事情。默认情况下,当安装本地 MTA 时,cron 会将作业的输出(stderr 和 stdout)邮寄给拥有该作业的用户,这就是这里发生的情况。

您执行的脚本失败,因为在 PATH 中找不到 ssmtp 程序(如标题所示指向 /usr/bin:/bin)。

调用ssmtp时使用完整的绝对路径就可以了。

编辑:在您的 crontab 中,您将 stdout 重定向到 /dev/null,但如果脚本在 stderr 上产生输出,那么仍然会发送一条带有该输出的消息。通常这是合理的,因为许多标准的 unix 工具会保持沉默,直到有重要的事情需要报告(例如错误),在这种情况下您希望得到通知。其他工具有一个“安静”标志或类似的标志来减少它们的冗长,可以在这种情况下使用。

如果您根本不想发送任何消息,您可以重定向stdout 和stderr:

... >/dev/null 2>&1

这样 cron 不会发送邮件,即使出现问题,所以你应该只在确保你的工作正常后才这样做。

【讨论】:

  • 我将脚本中的 ssmtp 命令行更改为 /usr/sbin/ssmtp 但我遇到了同样的情况。我还注意到我的其他一些 cron 作业也通过 ssmtp 发送!
  • 我遇到了完全相同的问题,即使使用绝对路径也不会发送邮件。你是怎么解决这个问题的?
  • @user16655 - 对于初学者,请检查您的日志文件(系统日志、邮件日志,...),那里可能有一些信息。如果这没有帮助,请创建一个包含详细信息的新问题(对于超级用户来说可能是最好的,因为这不是 stackoverflow 的真正主题)
  • 很好地在标题中找到路径。点赞。
猜你喜欢
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2016-04-08
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多