2014-11-24 37 views
0

我遇到一個很奇怪的行爲失敗。我發現似乎是一種工作,但我希望有人能向我解釋爲什麼我看到這種瘋狂的行爲。通過ssh運行腳本時在本地同一腳本成功

的高層我在做什麼:我想有一個shell腳本來阻止我的過程。我希望它足夠強大,可以殺死我正在尋找的一個或多個實例。我不想,如果沒有進程中運行(意思是我希望有一個0返回碼傳遞給kill命令......不是一個空洞的ARG列表)

我所看到的是一個腳本行爲它失敗當通過ssh傳遞一個命令而不是在本地執行相同的腳本時調用不同。非常奇怪的是,通過向我的ssh命令添加一個看似任意的命令,我能夠讓我的腳本正確執行,並且我不知道爲什麼!

停止素文字(回聲statments在那裏幫我調試 - 不是真正的腳本的一部分)

echo "Stopping myProcess" echo "-->的ps aux | grep myProcess | grep -v grep " pid= ps -ef | grep myProcess | grep -v grep |從不同的機器雖然腳本的執行的

Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4

結果:當NO進程運行AWK '{打印$ 2}' echo "Here: ${pid}" if [[ ! -z $pid ]]; then echo "Here2" kill -9 $pid else echo "Here3" echo "not stopping anything - no myProcess process running." fi echo "Here4" exit 0

結果腳本的本地執行的以下命令:

命令:

SSH eak0703 @ myServer上 '源$ {HOME}/.bash_profile中; CD /usr/local/myprocess/bin/;./stop-myProcess。'

結果:

Stopping myProcess --> eak0703 2099 0.0 0.0 10728 1500 ? Ss 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess eak0703 2100 0.0 0.0 10740 992 ? S 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess eak0703 2101 0.0 0.0 10740 668 ? S 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess Here: 2099 2100 2105 Here2

注意:一些奇怪的和難以解釋的,以我的理由,似乎有我的命令3所調用。我也知道,這個命令不會因爲通過kill -9被調用時用0我假定這是一個退出代碼終止,進程ID拾起grep的都沒有了。

現在 - 這裏有一個額外的 「日期| grep的廢話」 的相同的SSH命令拋出:

命令:

SSH eak0703 @ myServer上「源$ {HOME}/.bash_profile中; CD。/usr/local/myprocess/bin /; date | grep的廢話; ./停止myProcess'

結果:

Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4

把 「日期| grep的廢話」 解決的事情。看起來,魔法是在「|」 (管道)操作員。所以我實際上可以使用「anycommand | anyothercommand」來完成這項工作。

我可以使它工作 - 但我怎麼能證明隨機離開這樣一個塊在bash腳本?沒有人會知道爲什麼會出現這種情況。連我都沒有!如果有人遇到這個請幫忙!

回答

2

解析ps找到一個過程是脆弱和容易出錯的。你舉的例子是一個很好的例子,爲什麼:

不相關的進程(在bash過程ssh啓動)包含進程名作爲命令行的一部分,並無意中撿到了你的ps解析器。

當您使命令行包含單詞「grep」時,無關進程將被您的grep -v grep刪除。可以使用pgreppkill。這些工具基於可執行文件名稱列出/終止進程,因此遠比解析ps更強大。

+0

是的!這是對的。我仍然想知道爲什麼我的bash命令運行的似乎有3個「實例」? – eak12913 2014-11-24 23:38:21

+0

另外 - 對於任何試圖殺死可能具有相同名稱(例如:java)但具有不同參數的幾個進程之一併希望使用pkill/pgrep的用戶,他們應該使用'-f'標誌,以便查詢是匹配完整的參數列表。 # – eak12913 2014-11-24 23:40:52

+0

@ eak0703 1.由ssh調用的'bash'進程,2.執行'./ stop-myProcess'腳本的fork,因爲它沒有shebang,並且3 。你的命令替換的子shell。 – 2014-11-24 23:53:28