2010-06-04 241 views
0

我有一個for循環來獲取PID列表並殺死每個PID。我想顯示PS輸出的整行並將其寫入/ tmp/outfile。但是從PS輸出的每一行中,每個字段(PID,PPID,...)都會在/ tmp/outfile中與新行一起寫入。因此,如果PS輸出有三行作爲輸出,我想將這三行記錄到/ tmp/outfile中,但它會打破行中的每個字段並添加一個新行。我該怎麼做。殺死進程

for list in `ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep` 
do 
    echo "$list" >> $CUSTOM_TMP/test5566 
    PID=`echo $list | awk '{print $2}'` 
    kill -TERM "$list" 
done 
+0

使用「回聲-n」將從輸出 – bobah 2010-06-04 07:04:27

回答

3

您的for循環不會迭代行,但每個單獨的字段。 你的kill命令也有些不對。 只需更改您的代碼是這樣的:

ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep | while read list 
do 
    echo "$list" >> $CUSTOM_TMP/test5566 
    PID=`echo $list | awk '{print $2}'` 
    kill -TERM "$PID" 
done 
+0

+1 while'read' – 2010-06-04 07:57:48

+0

非常感謝信息。如果PS輸出沒有找到記錄,我想將它寫入日誌文件。我嘗試了下面的方式,它不工作。 if [「$ {list}」=「」];然後回聲「找到沒有進程名稱 - grep找不到記錄」fi – Arav 2010-06-07 00:47:33

+0

另外,如果kill命令失敗,我想將錯誤輸出重定向到一個變量並使用自定義API將其寫入日誌文件。這裏的問題,如果PS錯誤輸出有多行,當我將它移動到變量時,它會用空格替換新行。不知道 我該如何糾正這一點。與APILOG函數我可以只傳遞變量作爲參數。 kill -TERM「$ PID」2> $ CUSTOM_TMP/error_kill if [$? -ne 0];然後 ERROR = $(<$ CUSTOM_TMP/error_kill) WriteAPILog ERROR 「錯誤消息:$ ERROR」 RM $ CUSTOM_TMP/error_kill 音響 – Arav 2010-06-07 00:48:04

1

是不是更容易地使用你正在嘗試做killall命令?

+0

進程名稱中刪除一個換行符作爲參數傳遞給腳本傳遞。可能有2或3個進程同名,所以我試圖殺死它。如果我按照上面的方式而不是killall我可以做什麼 – Arav 2010-06-04 07:40:10

+0

也許吧,但是OP想用一個shell腳本來做:) – 2010-06-04 07:54:40

+0

非常感謝 – Arav 2010-06-07 00:50:22

0

你想循環運行之前ps

ps -ef | grep $"{process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep > $CUSTOM_TMP/test5566 2>/dev/null 

for PID in `cat $CUSTOM_TMP/test5566 | awk '{print $2}'`; do 
     kill -TERM $PID 
done 
rm -f $CUSTOM_TMP/test5566 

我還要插入一些理智,可能使用wc以確保文件實際上得到了一些數據從ps

+0

非常感謝您的信息 – Arav 2010-06-07 00:49:37

1

根本不需要循環。這用tee寫你的臨時文件。

list=$(ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep | tee $CUSTOM_TMP/test5566 | awk '{printf "%s ", $2') 
kill -TERM $list 
+0

非常感謝的信息。如果PS輸出沒有找到記錄,我想將它寫入日誌文件。我嘗試了下面的方式,它不工作。 if [「$ {list}」=「」];然後回聲「沒有找到進程名稱 - Grep沒有找到記錄」fi – Arav 2010-06-07 00:48:42

+0

另外,如果kill命令失敗,我想將錯誤輸出重定向到一個變量並使用自定義API將其寫入日誌文件。這裏的問題,如果PS錯誤輸出有多行,當我將它移動到變量時,它會用空格替換新行。不知道我該如何糾正這一點。與APILOG函數我可以只傳遞變量作爲參數。 kill -TERM「$ PID」2> $ CUSTOM_TMP/error_kill if [$? -ne 0];那麼ERROR = $(<$ CUSTOM_TMP/error_kill)WriteAPILog ERROR「錯誤消息:$ ERROR」rm $ CUSTOM_TMP/error_kill fi – Arav 2010-06-07 00:49:22

+0

@arav:如果您將後續代碼作爲對原始問題的修改發佈,讀起來會更容易。至於你的''if [「$ {list}」=「」]'片段,我認爲它沒有問題,假設'fi'是在一個單獨的行上(如果你不需要在它之前加一個分號)。順便說一句,「它不工作」根本沒有幫助。如果包含錯誤信息和結果與預期不同的特定方式,我們可以更好地幫助您。我不知道你的自定義API是如何工作的,但是這裏是Bash的工作方式:'variable = $( 2010-06-07 02:03:31

0

只要將awk部分移到最上面一行,否則您的代碼就沒問題了。

for list in `ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep | awk '{print $2}` 

do 
    echo "$list" >> $CUSTOM_TMP/test5566 
    PID=`echo $list` 
    kill -TERM "$list" 
done 
+0

非常感謝您的信息 – Arav 2010-06-07 00:50:04

0

對於一個襯墊 - 如果你的系統有p纖ep -

pgrep -d ' ' ${process_name} > kill.log && kill -TERM $(< kill.log)