累积sendmail进程

累积sendmail进程

我一直遇到一个问题,我会看到特定流程的许多实例:

/usr/sbin/sendmail -FCronDaemon -i -odi -oem -oi -t

我已经阅读了一些内容,似乎进程正在启动以发送 cron 作业的 stdout 输出,但由于某种原因永远不会终止。

每天有一个进程,因此它相信它与每日 cron 作业有关。该进程的开始时间ps aux(每天 04:01)似乎与每日 cron 作业的启动时间(每天 04:02)一致。其内容/etc/cron.daily为:

0anacron  0logwatch  cups  logrotate  makewhatis.cron  mlocate.cron  rpm  tmpwatch

其内容/etc/crontab为:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
 # run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

到目前为止,当这些进程数量很大时,我已经手动终止了它们;如果不这样做,服务器就会耗尽资源,并且其上运行的服务也会停止。最坏的情况是,我会简单地设置另一个 cron 来终止这些进程,但我宁愿从源头上阻止问题。有谁知道这个问题的原因?谁能提供调试步骤?

答案1

该问题根本不在于 sendmail。使用pstree,我能够确定还有更多进程也挂起,未终止,并且由 crond 为其父进程。我查看了每个流程,发现其中一个流程正在执行以下操作:

cat /var/log/some_log_file

当我这么做的时候ls /var/log/some_log_file,我看到了

/var/log/some_log_file|

some_log_file实际上是一个命名管道!似乎 cron 作业正在尝试从该管道读取数据,但从未终止,因为没有任何内容发送到该管道。

作为修复,我删除了它并将其设为常规文件。

答案2

就我而言,我有 5 个 cron 作业,并且他们默认发送邮件。所以我需要在 cron 作业的末尾添加这个表达式。

>/dev/null 2>&1

例如:

*/5 * * * * /bin/sh /usr/share/shell/gnk-loader-rev2-20028-0027.sh > /dev/null 2>&1

您可以找到更多信息这里或者这里

相关内容