2012-07-02 96 views
0

在外殼腳本可以說,我已經運行這樣殼牌腳本獲取命令PID

for i in `ps -ax|grep "myproj"` 
do 
    echo $i 
done 

這裏的命令,grep命令將作爲一個單獨的處理被執行。那麼我如何在shell腳本中獲得它的PID?

+0

如果你找到它,你將如何處理它的PID?當它可用時,命令已經完成,所以PID不再有效。 –

+0

假設我在循環中獲得它與某個值進行比較? – Cygnus

回答

1

我在這裏出門,理解這看起來更像是一條評論。

爲什麼你需要grep命令的PID?

在你的評論中,你說你想在循環中對比某件事。我認爲這是你的問題,該循環將(有時)不僅包括myproj,但也是一個關於你的grep命令的項目?如果是這樣,請嘗試以下操作:

for i in `ps -ax | grep -v grep | grep "myproj"` 
    do 
     echo $i 
    done 

-v開關基本上反轉的格局,所以grep -v grep(或grep -v "grep",這可能看起來少了幾分尷尬)將只包括行不包含字符串的「grep」(見man grep)。 請注意,在某些情況下,這可能過於模糊,例如,如果實際查找的模式還包含字符串「grep」。例如,以下可能無法按預期工作:ps -ax | grep -v grep | grep mygrepling

但是,在您的特定情況下,只查找「myproj」,它會執行此操作。

或者你可以簡單地使用

for i in `ps -ax | grep "my[p]roj"` 
    do 
     echo $i 
    done 

這樣,也沒有必要知道grep命令的PID,因爲它根本不會顯示爲一個循環迭代。

+0

OK .. -v開關與grep有什麼關係? – Cygnus

+0

謝謝!這解決了問題:) – Cygnus

1

當你在後臺運行的進程,則可以得到其PID在$!

$ ps aux | grep dddddd & echo $! 
[1] 27948 
27948 
ic  27948 0.0 0.0 3932 760 pts/3 R 08:49 0:00 grep dddddd 

當前景---過程中不會再在你想找到它的PID點存在。當你在循環中時,for語句已經執行並且grep已經退出,所以你不能再找到它的PID了。

+0

謝謝!我必須在後臺運行它才能獲得它的PID。 :) – Cygnus

+0

當然你可以做到,但也可能有其他方法來解決你的任務。在後臺運行grep並找到它的PID,好吧......這有點奇怪:) –