Linux 为什么我的进程计数脚本会给出误报?

Linux 为什么我的进程计数脚本会给出误报?,linux,bash,unix,shell,scripting,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 #/bin

我有下面的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
#/bin/bash
行=`ps-ef | grep httpd | wc-l`
如果[“$lines”-gt“60”]
然后
mailx-s“超过60种httpd工艺”me@me.com
您可能已经想到了这一点,但是

在时间t0,有61个

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

尝试在电子邮件中包含$line的值,您将看到


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

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

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

您也可以这样做,将grep和wc的使用减少到一个awk

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

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

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

  • 您可以执行
    grep[h]ttpd
    来删除
    grep
    。是的!这比使用PS输出更容易和更可靠。请考虑重写这个项目,以便响应在搜索结果中更有用。GRPP[H] TTPD是整齐的,不知道…AlOK的第五点可能是这里最相关的事情。必须手动监视已处理的进程数并不完全是“最佳实践”,除非您在某处查找bug。