!/bin/sh-xv

!/bin/sh-xv

我使用的是 centos 7.0/6.5。/etc/cron.hourly/mail.cron 的内容

#!/bin/sh
log=/var/log/mail.cron.log
echo "`hostname` `date`" >> $log 2>&1
mailx -s "test mail" [email protected] < $log

/var/log/mail.cron.log 的结果

myhost Mon Jul 28 11:01:01 CST 2014

但是,我收到了一封空邮件,邮件主题正确。因此,我手动测试了这个 cron。我收到了正确的电子邮件内容。

myhost Mon Jul 28 11:01:01 CST 2014
myhost Mon Jul 28 11:30:29 CST 2014

以下是相关日志/var/log/cron

Jul 28 11:01:01 myhost run-parts(/etc/cron.hourly)[24577]: starting mail.cron
Jul 28 11:01:02 myhost run-parts(/etc/cron.hourly)[24605]: finished mail.cron

我想知道如何调试这个问题。

答案1

有几件事可以尝试。

  1. !/bin/sh-xv

  2. 尝试使用两个大于号 2>>&1 重定向 stderr。

第一个命令将为您提供脚本的分步输出。我会先尝试不将 stderr 重定向到日志文件。Cron 应该会向您发送一份输出副本。您可以准确地看到哪里出了问题。

第二个。也许你遇到了一个错误,导致你的 stdout 崩溃?(可能不是,它在 CentOS 6.5 中可以正常工作。)

您还可以使用 cat 检查不可打印的字符。

cat -vet /etc/cron.hourly/mail.cron

还要尝试的另一件事是使用命令的绝对路径,/bin/echo 而不是 echo,/bin/date 而不是 date,/bin/hostname 而不是 hostname。(ymmv)Jim 在 cron 中完全正确,并不总是使用与同一交互用户完全相同的环境。

答案2

根据您的评论,您确信该cron作业有效 - 但是,您已在登录时手动运行该作业对其进行了测试。问题是,运行的作业cron没有考虑您当前用户的设置和环境变量,因此您可能需要.bash_profile在脚本中发送电子邮件之前为用户获取设置文件。

将您的脚本更改为:

#!/bin/sh
source $HOME/.bash_profile     # or whatever profile file or setting you are using
log=/var/log/mail.cron.log
echo "$(hostname) $(date)" >> $log
mailx -s "test mail" [email protected] < $log

cron它对您的 shell 一无所知 - 它由系统启动,因此它具有最小的环境。如果您希望它能够找到您的程序或运行系统中安装的实用程序,您必须首先让它知道这些程序在哪里,您可以通过在.profile脚本开头设置变量来实现这一点。

一些有用的链接:

答案3

我看到您得到了一些答案,但没有一个明确的有效答案。对我有用的是按以下方式设置 cron:

*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; 如果 [[ -n $body ]]; 然后 echo "$body" | mail -s "Cron 脚本输出"[电子邮件保护];fi)

这将捕获输出并将其发送到邮件,如果没有它,即使在脚本中运行,我也会收到一封空的电子邮件。(感谢 colucix)

相关内容