2011-09-27 113 views
1

我正在嘗試編寫一組函數,可以檢查當我遇到一些意外輸出時是否正在運行進程名稱。我已經凝結的問題取決於系統ps命令,可以採取「-fC的論點下面的腳本名稱isRunning.sh ...無法理解ps | wc輸出差異

#!/bin/bash 
progname=isRunning.sh 
ps -fC isRunning.sh 
pRet=`ps -fC ${progname} | wc -l` 
echo pRet $pRet 
psOut=`ps -fC ${progname}` 
wcOut=`echo "${psOut}" | wc -l` 
echo 
echo ps output 
echo "${psOut}" 
echo 
echo wcOut $wcOut 

在管道ps輸出的第一次嘗試WC得到3的回報。第二次嘗試獲得預期的2的返回值。任何人都可以解釋這種行爲嗎?我認爲這是我忽略的一些愚蠢的東西。

感謝, BBB

編輯:我的輸出

UID  PID PPID C STIME TTY   TIME CMD 
root  6717 5940 0 13:10 pts/0 00:00:00 /bin/bash ./isRunning.sh 
pRet 3 

ps output 
UID  PID PPID C STIME TTY   TIME CMD 
root  6717 5940 0 13:10 pts/0 00:00:00 /bin/bash ./isRunning.sh 

wcOut 2 
+0

請向我們展示您的程序的輸出。 –

+0

我似乎無法得到這個帖子格式化我想要的方式。 – bittramp

+0

改爲編輯您的問題。註釋不適用于格式文本 –

回答

1

我得到2次都嘗試。你的ps可能會輸出一個額外的空白行,或者其他的,然後你的shell的反向擴展會剝離它。或者,也許你實際上有兩個進程匹配你第一次運行它。

如果你只是想看看它的運行,從你的ps檢查退出代碼:

if ps -C "${progname}" > /dev/null; then 
    echo its running 
else 
    echo not running 
fi 

更妙的是,你應該看看pidofpgrep如果你能依靠他們存在於無論您的目標是哪個系統。或者使用LSB函數,如果你在Linux上。

編輯:其實,因爲您正在尋找自己的副本運行,您可能會拿起殼來做叉子來實現管道。

+0

謝謝。我需要做的事情之一是檢查是否有一個已經運行的腳本實例。所以我把ps給了wc來計數。我會看看我是否可以讓pgrep工作。我只是不明白我的腳本中發生了什麼。我可以執行ps -fC $ {progname} | wc -l在我的腳本之前的pRet分配,我得到了2的輸出。我想我正在做的事情是獲得額外的換行,只是不知道在哪裏。也許是一個紅帽的事情。 – bittramp

+0

我剛剛在不同的redhat 9機器上試過這個腳本,得到了3/2結果。我可以用其他選項解決這個問題,但我只是好奇。 – bittramp

+0

@bittramp:可能是一個RedHat的東西,我在Debian上(或者是因爲我測試了一些稍微不同的東西 - 請參閱我的編輯)。但是無關緊要,因爲RedHat肯定有'pidof'。或者你可以使用退出代碼。 – derobert