2013-06-18 116 views
0

我想在Cygwin中運行一個shell腳本,但我遇到了將變量傳遞給子shell的問題!cygwin殺死進程問題

我有一個非常簡單的腳本,實際上需要一個進程的PID,並從那裏我想殺死腳本內的進程。

# my_proc_kill.sh 
# 
export c=$(ps -W | grep -ir behave | sed 's/\([0-9]\+\).*/\1/') 
echo $c 
#1 
/bin/kill -f $c  
#2     
sh -c '/bin/kill -f ${c}' "$c" 
#3  
sh -c '/bin/kill -f [email protected]' _ "$c"   
#4 
e=$(taskkill /PID $c) 

我試圖殺死這個過程有四種不同的方式,而且他們沒有工作!

我不知道爲什麼(#1)和(#4)工作得很好,如果我直接在Cygwin終端內調用它們,但不是在運行「my_proc_kill.sh」時。

我注意到的另一件事是,如果我用實際進程號替換「$ c」,然後運行「my_proc_kill.sh」,那麼這將起作用。所以,它看起來變量值「$ c」沒有傳遞給「taskkill」!! 如何修改代碼,以便taskkill知道變量「$ c」?!?

但是不應該爲特定進程修復PID,只要我沒有終止進程,無論我訪問哪個進程ID的shell?

請指教如何解決這個問題?

以下是錯誤消息我得到的,當我運行該腳本:

5040 
kill: illegal pid: 5040 
kill: illegal pid: 5040 
kill: illegal pid: 5040 
kill: illegal pid: 
ERROR: Invalid query 

爲什麼「殺」認爲這是非法的pid? 但是,當我在Cygwin終端中使用相同的PID號碼(本例中爲5040)時,它的工作原理是什麼? (以下是好的)

$/bin/kill -f 5040 

任何想法如何解決這個問題?

在此先感謝。

+0

1.用'echo。$ c.'替換'echo $ c'以確保$ c不包含空格等。 2.什麼殺了-f?未知在我的Ubuntu 10. 3.不'ps -W | grep -ir的行爲...'也打印grep的pid? 4.爲什麼grep -r? 5.什麼是ps -W? – user829755

+0

我認爲這不是問題。因爲在腳本里面,我用實際的PID號代替了$ c(對於我的情況是5040),並且我仍然得到了和以前完全相同的錯誤。換句話說,我將腳本更改爲(/ bin/kill -f 5040)仍然是同樣的事情。我也試過(/ bin/kill/5040)仍然是一樣的錯誤。但是當我在Cygwin命令行中輸入這個精確的表達式(/ bin/kill -f 5040)時,它殺死了進程,並且一切看起來都很好。 – user2201373

回答

0

您的輸出似乎表明您正試圖殺死相同的PID 5次。

#!/bin/bash 

export c=$(ps -W | grep -ir notepad | sed 's/\([0-9]\+\).*/\1/') 
echo $c 

/bin/kill -f $c 

我沒有得到任何奇怪的行爲:

我用紅色帽子的cygwin的(CYGWIN_NT-6.1-WOW64)運行腳本的修改版本。成功調用kill會輸出PID(顯示在第一行)。

如果重複最後一行4次,我會收到錯誤消息。

除此之外,最後一個PID有可能是一個子進程,在父進程完成後終止 - 就像樹殺。

作爲替代建議,除了使用/ IMAGE選項外,我還通過執行帶有/ F參數的taskkill來使用「髒」方式來匹配exe名稱,而不是指定PID。提供的示例:

taskkill /? 
+0

我使用了準確的Cygwin版本(CYGWIN_NT-6.1-WOW64),我只是從腳本中刪除了其他所有內容,並且只保留了它的樣子(只有三行),但是運行後,我再次得到「kill:illegal pid:11132」,但11132是正確的PID,一旦我在命令行執行(/ bin/kill -f 11132),一切正常!你會知道可能會發生什麼嗎? – user2201373

+0

更新: 經過很長時間,我剛剛解決了這個問題。問題一直是回車符。一旦在GVIM中設置了「:e ++ ff = unix」,我看到了所有的回車字符,並且一旦我讀到了它們,那麼一切都開始正常工作。 – user2201373

+0

@ user2201373:也許最好將解決方案添加到問題中,或將其作爲回答以便於查找。 –