[英]Why does my process counting script give false positives?
我有以下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
httpd
進程可能會完成,或者啟動,或者兩者兼而有之。 因此,進程的數量可以不同。 grep
進程(大多數情況下,可能會在grep
啟動之前完成ps
完成)。 避免這種情況的一種簡單方法是將命令更改為ps -ef | grep [h]ttpd
ps -ef | grep [h]ttpd
。 這將確保grep
與grep [h]ttpd
不匹配。 pgrep
,它可能更適合你的目的。 grep ... | wc -l
grep ... | wc -l
通常可以用grep -c ...
替換grep -c ...
你可能已經想過這個,但......
在時間t0,有61。
在時間t1,當您閱讀電子郵件時,有58個。
嘗試在電子郵件中包含$ lines的值,你會看到。
或者嘗試使用/ proc / * / cmdline,它可能更可靠。
grep httpd
查找名稱中包含httpd的所有進程,包括grep httpd
本身,以及其他可能的進程。
“ps -ef | grep httpd”找不到只是httpd進程,是嗎? 它找到ps中的完整(-f)列表包含字符串“httpd”的進程。
這可能無法解決您的問題,但您可以通過使用pgrep
來簡化操作。
你也可以這樣做,減少使用grep和wc到一個awk。
ps -eo args|awk '!/awk/&&/httpd/{++c}
END{
if (c>60){
cmd="mailx -s \047Over 60\047 root"
cmd | getline
}
}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.