【问题标题】:.sh script run by cronjob does not send emailcronjob 运行的 .sh 脚本不发送电子邮件
【发布时间】:2016-04-06 12:25:02
【问题描述】:

我有一个运行 .sh 脚本的 cronjob,该脚本应该创建一个 .txt 文件并将其作为电子邮件发送。

我用sudo crontab -e

这是脚本:

send_update.sh, -rwxrwxrwx

#!/bin/sh
python /home/myusername/backend/mypy.py > update.txt
sed -i '1s/^/Subject: Daily Update /' update.txt
sendmail myemail@gmail.com < /home/myusername/backend/update.txt
echo "tester" >> tesert.txt

有趣的是,这个文件可以正常运行,因为回显确实会打印到文件中,但我没有收到电子邮件。

如果我从命令行输入sudo ./send_update.sh 运行该文件,它确实会发送一封电子邮件。

编辑 1

cron 文件行如下所示:

* * * * * cd /home/myusername/backend &amp;&amp; ./send_update.sh

编辑 2

tesert.txt 与 send_update.sh 位于同一文件夹中,并且确实会被 cron 作业打印到

编辑 3

所有涉及的文件都有权限:-rwxrwxrwx

编辑 4

#!/bin/sh
python py2db.py > update.txt
sed -i '1s/^/Subject: Daily Update /' update.txt
sed -i '$ d' update.txt
date >> update.txt
sendmail myemail@gmail.com < update.txt

这是新的 send_update.sh 文件。它每分钟成功打印最近一分钟以更新.txt,但它从不发送电子邮件。

编辑 5

按照建议,我将文件更改为

#!/bin/sh
python py2db.py > update.txt || echo "error python" >>/tmp/error.log
sed -i '1s/^/Subject: Daily Update /' update.txt || echo "error sed1" >>/tmp/error.log
sed -i '$ d' update.txt || echo "error sed2" >>/tmp/error.log
date >> update.txt || echo "error date" >>/tmp/error.log
sendmail myemail@gmail.com < update.txt || echo "error sendmail" >>/tmp/error.log

它运行后cat /tmp/error.log 读取error sendmail

编辑 6

查看日志后发现:

发送邮件:未找到

我现在正在尝试更新包含 sendmail 的路径。如果有人能指导我如何做到这一点,将不胜感激。

编辑 7

sendmail 更改为/usr/sbin/sendmail 解决了问题,建议的错误检查将我引导到那里。

【问题讨论】:

  • 检查权限;修改脚本以使用 su - "user",其中 "user" 与您手动运行脚本时使用的相同
  • 当您手动运行它时,您是否 /home/myusername/backend 目录中?因为你的 cron 工作不会。为什么你只在那一行使用绝对路径?
  • @EtanReisner 查看我的更新
  • 您希望该 cron 作业在哪个用户下运行?它实际上在哪个用户下运行? sendmail 是否向标准输出或标准错误输出任何内容?您的邮件日志中有任何内容吗?

标签: linux bash shell email


【解决方案1】:

为您的脚本添加调试并在文件中记录错误,例如:

#!/bin/sh
python py2db.py > update.txt || echo "error python" >>/tmp/error.log
sed -i '1s/^/Subject: Daily Update /' update.txt || echo "error sed1" >>/tmp/error.log
sed -i '$ d' update.txt || echo "error sed2" >>/tmp/error.log
date >> update.txt || echo "error date" >>/tmp/error.log
sendmail myemail@gmail.com < update.txt || echo "error sendmail" >>/tmp/error.log

也许您没有某个命令的路径,请尝试导出 PATH=。

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2015-01-20
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多