为什么我的流程计数脚本会出现误报?

时间:2009-12-27 03:12:26

标签: linux bash unix shell scripting

我有以下bash脚本,它列出了httpd进程的当前数量,如果它超过60,它应该给我发电子邮件。这种方式有80%的时间可以工作,但由于某种原因,有时它会在不超过60时通过电子邮件发送给我。有什么想法吗?

#!/bin/bash
lines=`ps -ef|grep httpd| wc -l`
if [ "$lines" -gt "60" ]
then
        mailx -s "Over 60 httpd processes" me@me.com < /dev/null
fi

6 个答案:

答案 0 :(得分:5)

  1. 检查和发送电子邮件之间存在延迟。在那段时间内,某些httpd进程可能会完成或启动,或两者兼而有之。因此,进程数量可能不同。
  2. 您在流程中包含grep流程(大多数情况下,ps可能会在grep启动之前完成)。避免这种情况的一种简单方法是将命令更改为ps -ef | grep [h]ttpd。这样可以确保grepgrep [h]ttpd不匹配。
  3. 在Linux上,你有pgrep,这可能更适合你的目的。
  4. grep ... | wc -l通常可以替换为grep -c ...
  5. 如果您想限制httpd请求的数量,我相信您可以在apache配置文件中设置它。

答案 1 :(得分:4)

你可能已经想过这个,但是......

在时间t0,有61。

在时间t1,当您阅读电子邮件时,有58个。

尝试在电子邮件中包含$ lines的值,您会看到。

或者尝试使用/ proc / * / cmdline,它可能更可靠。

答案 2 :(得分:4)

grep httpd查找名称中包含httpd的所有进程,包括可能grep httpd本身,以及其他可能的进程。

答案 3 :(得分:1)

“ps -ef | grep httpd”找不到httpd进程,是吗?它找到ps中的完整(-f)列表包含字符串“httpd”的进程。

答案 4 :(得分:1)

这可能无法解决您的问题,但您可以使用pgrep来简化问题。

答案 5 :(得分:0)

你也可以这样做,减少使用grep和wc到一个awk。

ps -eo args|awk '!/awk/&&/httpd/{++c}
END{
    if (c>60){
        cmd="mailx -s \047Over 60\047 root"
        cmd | getline
    }
}'