2010-02-26 123 views
2

一個只有目的的Unix shell腳本 - 統計qmail運行進程的數量(可以是其他任何東西)。容易的事情,但必須有在代碼中的一些錯誤:linux shell腳本kiddie的問題

#!/bin/bash 
rows=`ps aux | grep qmail | wc -l` 
echo $rows 

因爲

echo $rows 

始終顯示行數量較多(11)不是,如果我只是在計算行

ps aux | grep qmail 

只有8行。它是否也以這種方式在您的系統上工作?

+0

@roe,不要這麼想,'grep qmail'已經刪除了PID/PPID標題行。 – paxdiablo 2010-02-26 10:52:08

+0

這應該被grep過濾掉。 – ConcernedOfTunbridgeWells 2010-02-26 10:53:25

+0

@paxdiablo:當然...傻了。 – falstro 2010-02-26 11:51:23

回答

1

不,因爲我沒有運行qmail。不過,你會想,在最低限度,排除進程中運行你的grep:

ps aux | grep qmail | grep -v grep 

對於調試,您可能想要做的:

rows=`ps aux | grep qmail` 
echo $rows >debug.input 
od -xcb debug.input 

(看到你輸入腳本在細節),然後重寫你的腳本暫時爲:

#!/bin/bash 
rows=`cat debug.input | wc -l` 
echo $rows 

這樣的話,你可以看到輸入並找出它對代碼的影響,即使在調試時也是如此。

一個好的調試器最終會學習只改變一個變量。如果你改變你的代碼來使它工作,那就是變量 - 不要讓代碼的輸入也改變。

+0

爲什麼要「grep qmail」打印包含「grep」的行? – 2010-02-26 10:47:53

+0

+1,雖然它也應該在他的手動運行中顯示出來。 – falstro 2010-02-26 10:48:24

+3

,因爲有一個名爲'grep qmail'的額外進程包含...''qmail'。 – LiraNuna 2010-02-26 10:48:26

0

使用

$ /sbin/pidof qmail

+0

這不顯示任何東西(qmail正在運行),我不知道爲什麼 – peterson 2010-02-26 11:01:31

+0

它應該工作。嘗試給qmail的完整路徑。也許以root身份運行? – 2010-02-26 11:08:59

3

如今的Linux,有pgrep。如果你擁有了它你的系統,你可以跳過grep -v grep

$ var=$(pgrep bash) # or `pgrep bash | wc -l` 
$ echo $var 
2110 2127 2144 2161 2178 2195 2212 2229 
$ set -- $var; echo ${#} 
8 

另外,如果您ps命令有-C選項,另一種方式

$ ps -C bash -o pid= | wc -l 

如果沒有,你可以在你的grep集字符類模式

$ ps aux|grep [q]mail | wc -l 
0

幾個方法...

ps -e | grep ' [q]mail' | wc -l 
ps -C qmail -opid= | wc -l 
pidof qmail | tr ' ' '\n' | wc -l 
2

看來您正在計算grep進程本身以及ps通常在其輸出之前打印的標題行。

我建議更多的東西一樣:

qprocs = $(PS auxwww | grep的-c 「[Q]郵件」)

...注意,GNU grep有一個 「-c」切換到打印「計數」而不是線條本身。這裏使用正則表達式的技巧是匹配qmail而不匹配grep命令行上的文字字符串。因此,我們將字符串中的任何單個字符包裝在方括號中,使其成爲單個字符「class」。正則表達式:[q]郵箱匹配字符串qmail不匹配字符串[q]郵件

請注意,即使使用此正則表達式,您仍可能發現一些錯誤的正匹配。如果你真的想要更精確,那麼你應該給你的ps命令提供一個自定義的輸出格式字符串(參見手冊頁),或者你應該通過一個pipemill來提供它,或者你應該根據字段解析ps命令的輸出(使用awkcutwhile read環)。 (其中-o選項到ps是迄今爲止最容易的)。

0

pgrep在許多Linux發行版上,我想其他Unices可用。

[[email protected] ~]$ whatis pgrep 
pgrep    (1) - look up or signal processes based on name and other attributes 
[[email protected] ~]$ pgrep mingetty 
1920 
1921 
1922 
1923 
1924 

在你的情況下,pgrep qmail | wc -l應該做的伎倆。