2014-08-27 158 views
3

我想寫一個簡單的腳本來殺死一個進程。我已閱讀Find and kill a process in one line using bash and regex,所以請不要將我重定向到那個。如何將bash命令的輸出存儲在變量中?

這是我的代碼:

LINE=$(ps aux | grep '$1') 
PROCESS=$LINE | awk '{print $2}' 
echo $PROCESS 
kill -9 $PROCESS 

我希望能夠像

sh kill_proc.sh node運行的東西,並讓它運行

kill -9 node

但不是我所得到的是

kill_process.sh: line 2: User: command not found 

我發現當我登錄$PROCESS它是空的。 有誰知道我在做什麼錯?

+1

'var ='command''' – 2014-08-27 19:39:33

+2

'PROCESS = $ LINE | awk'{print $ 2}''是錯誤的。將它與第一行進行比較。 – 2014-08-27 19:39:38

+1

@EtanReisner如果我嘗試'PROCESS = $(線| awk的 '{打印$ 2}')'我仍然得到一個錯誤'LINE':命令不found' – dopatraman 2014-08-27 19:41:38

回答

3
PROCESS=$(echo "$LINE" | awk '{print $2}') 

PROCESS=$(ps aux | grep "$1" | awk '{print $2}') 

我不知道爲什麼你得到你所引用的錯誤。我無法複製它。當你這樣說:

PROCESS=$LINE | awk '{print $2}' 

殼它擴展爲這樣的事情:

PROCESS='mayoff 10732 ...' | awk '{print $2}' 

(我已經縮短$LINE的值,使例子可讀。)

第一管道的子命令設置變量PROCESS;這個變量設置命令沒有輸出,所以awk立即讀取EOF並且不打印任何東西。由於管道的每個子命令都在子shell中運行,所以PROCESS的設置僅在子shell中進行,而不在運行腳本的父shell中進行,因此PROCESS仍未在您的腳本中爲以後的命令設置。

(請注意,bash一些版本可以運行在當前shell,而不是在子shell管道的最後一個子命令,但這並不影響這個例子。)

而是在子shell設置PROCESS的並且在標準輸入上不向awk提供任何東西,則要將LINE的值提供給awk,並將結果存儲在當前shell中的PROCESS中。因此,您需要運行一個將LINE的值寫入其標準輸出的命令,並將該標準輸出連接到標準輸入awk。命令echo可以執行此操作(或chepner在他的回答中指出的printf命令)。

2

您需要使用echo(或printf)實際上將$LINE的值放到awk命令的標準輸入上。

LINE=$(ps aux | grep "$1") 
PROCESS=$(echo "$LINE" | awk '{print $2}') 
echo $PROCESS 
kill -9 $PROCESS 

有沒有必要使用LINE;您可以設置PROCESS與單行

PROCESS=$(ps aux | grep "$1" | awk '{print $2}') 

或更好,跳過grep

PROCESS=$(ps aux | awk -v pname="$1" '$1 ~ pname {print $2}') 

最後,不要使用kill -9;這是調試錯誤程序的最後手段。對於你自己編寫的任何程序,kill "$PROCESS"應該足夠了。

+0

有點不相關,但...我無法真正殺死這個進程。我的腳本不再拋出錯誤,但即使使用'sudo'運行,該過程也不會被殺死。想法? – dopatraman 2014-08-27 19:53:28

+0

在腳本的頂部放置'set -x'以更好地瞭解它正在做什麼。該命令使shell在運行之前回顯每個命令。 – 2014-08-27 19:57:35

+0

@dopatraman顯示完整的流程線。在「STAT」字段中包含「Z」? (Z =殭屍 - 不可驅動)。或者,也許你想殺死一個等待某些內核I/O的進程。 – jm666 2014-08-27 19:57:55

相關問題