2017-01-23 60 views
0

我已經在這裏閱讀了幾篇關於pgrep'似乎'返回自己的帖子,即使它永遠不應該。關鍵似乎是bash和sh功能之間的區別。除了我的情況,我已經證實sh真的是一個bash的鏈接。關於pgrep返回自己的確認

  • 我在SuSE 12 x86_64的運行
  • /bin/sh的是來砸
  • /斌/ bash的一個鏈接是真正的二進制

我有叫Ruby腳本pgrep命令是這樣的:

cmd="/usr/bin/pgrep -lf \"#{target}\"" 
    pidList=`#{cmd}` 

我需要,因爲我實際使用的參數來唯一標識一個特定的Java「過程中要使用完整的命令行。

現在,由於一些不相關的愚蠢,我幾乎立即對每個返回的pid執行ps -p。有一段時間,這讓我非常悲傷,因爲ps有時候什麼都不會返回。最終我能夠發現pid上的ps返回pgrep命令的情況。但它是pgrep命令本身,而不是像sh -c "pgrep -f blah"

要回顧一下:

p纖ep永遠不會返回本身。但是sh和bash的區別可能會導致它顯示一個子shell。但是我證實了sh是一個bash的鏈接,所以在行爲上應該沒有區別。

我懷疑(並且正在尋求確認)是因爲Ruby反引號而創建了一個額外的子命令,而這正是由pgrep命令拾取的(僅有時間計時問題?)。

這一直是一個真正的痛苦,我想確保我實施的修復將真正使問題消失。鑑於我與,我要麼會

  1. 工作追加| grep -v grep我指揮的最後
  2. 扔掉含有「grep」可以同時通過紅寶石內返回的結果循環任何結果的代碼腳本

我想,#2是速度更快,但它仍然惹惱我,我一定要過濾掉p纖ep本身。

我在正確的軌道上嗎?或者您認爲其他方面正在發揮作用嗎?

謝謝你的時間!

+1

當''因爲它sh'表現爲POSIX'sh',不'bash' bash'被調用。 –

+0

啊,那將是失蹤的拼圖!謝謝! –

回答

0

答案已經在我的問題的評論中,但我想我會用正式答案關閉它。

該件的我缺少信息是

當bash被調用作爲SH它表現爲一個POSIX SH,不是bash。 - JörgW Mittag 1月23日23:31

所以是的,pgrep表現正常。但是當你通過反引號從Ruby腳本中調用它時,你仍然需要過濾掉'pgrep'

0

問題不在shell風格中:調用pgrep的shell進程也在進程中顯示(並且在搜索字符串中其完整的命令),所以我們需要過濾出來是這樣的:

pgrep -f target | grep -v $$