我有以下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
答案 0 :(得分:5)
httpd
进程可能会完成或启动,或两者兼而有之。因此,进程数量可能不同。grep
流程(大多数情况下,ps
可能会在grep
启动之前完成)。避免这种情况的一种简单方法是将命令更改为ps -ef | grep [h]ttpd
。这样可以确保grep
与grep [h]ttpd
不匹配。pgrep
,这可能更适合你的目的。grep ... | wc -l
通常可以替换为grep -c ...
。答案 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
}
}'