簡體   English   中英

為什么我的流程計數腳本會出現誤報?

[英]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
  1. 檢查和發送電子郵件之間存在延遲。 在那個時候,一些httpd進程可能會完成,或者啟動,或者兩者兼而有之。 因此,進程的數量可以不同。
  2. 您在進程中包含grep進程(大多數情況下,可能會在grep啟動之前完成ps完成)。 避免這種情況的一種簡單方法是將命令更改為ps -ef | grep [h]ttpd ps -ef | grep [h]ttpd 這將確保grepgrep [h]ttpd不匹配。
  3. 在linux上,你有pgrep ,它可能更適合你的目的。
  4. grep ... | wc -l grep ... | wc -l通常可以用grep -c ...替換grep -c ...
  5. 如果要限制httpd請求的數量,我相信您可以在apache配置文件中設置它。

你可能已經想過這個,但......

在時間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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM