2016-05-31 199 views
2

我正在使用下面的腳本來查找和殺死進程,但它以某種方式無法正常工作。 請幫助編輯這個,如果有任何缺陷。我正在熱衷於JVM。使用AIX機器。Shell腳本無法殺死進程

PID=`ps -eaf | grep JVM| grep -v grep | awk '{print $2}'` 
    if [[ "" != "$PID" ]] 
    then 
     echo "killing $PID" 
     kill $PID 
    else 
     echo "PID not found" 

    fi 
+0

'if'更好地寫成'if [[「x」!=「x $ PID」]]',這確保'!='用於字符串比較(作爲獎勵,它也確保了空的'grep '在不同的shell上正確處理查詢)。 – grochmal

+0

代碼看起來基本正確 - 您可以詳細說明「shomehow無法正常工作」的含義,但我們會假定該過程在殺死後仍然存在。如果尼爾埃利斯的回答不能幫助你,你就不得不多加解釋。 - 我從ps輸出修復字符串時的操作就像'ps -eaf | grep'[J] VM'' ..它不需要'grep -v grep',因爲grep命令與正則表達式不匹配 –

回答

2

Wikipedia entry

在Unix和類Unix操作系統,殺是用於 將信號發送到一個進程的命令。默認情況下,發送的消息是終止信號,它會請求進程退出。但是殺人是 某些用詞不當;發送的信號可能與 進程查殺無關。

因此在默認情況kill發送SIGTERM(相當於殺-15),你可能會需要做SIGKILL:

kill -9 $PID 

或者如果你一直格外小心,或者你需要系統安全關機那麼我建議您使用SIGINT,因爲它與鍵盤上的Ctrl-C相同。所以

kill -2 $PID 

Java應用程序恐怕doesn't always handle SIGTERM correctly他們依靠在關閉掛鉤的良好行爲。爲了確保應用程序能夠正確地處理像SIGTERM您可以直接處理SIGTERM信號信號:

public class CatchTerm { 
    public static void main(String[] args) throws Exception { 
    Signal.handle(new Signal("TERM"), new SignalHandler() { 
     public void handle(Signal sig) { 
     //handle sigterm such as System.exit(1) 

     } 
    }); 
    Thread.sleep(86400000); 
    } 
} 

爲了完整這裏是common signals

| Signal | ID | Action | Description   | Java 
| ---  | --- | ---  | ---     | --- 
| SIGHUP | 1 | Terminate | Hangup    | The application should reload any config    
| SIGINT | 2 | Terminate | Ctrl-C    | Keyboard interrupt, start clean shutdown 
| SIGQUIT | 3 | Terminate | Terminal quit signal | JVM traps and issues a Thread dump  
| SIGABRT | 6 | Terminate | Process abort signal | Do not handle, quit immediately    
| SIGKILL | 9 | Terminate | Kill (forced)  | Cannot be trapped      
| SIGTERM | 15 | Terminate | Termination signal. | Quit quickly, safe but fast     

對於更先進的工藝選擇,請參閱killallpkill

+0

'SIGKILL'('kill -9 ...')通常不被推薦,因爲它不能被過程捕獲,並且不能進行清理。 – andlrc

+0

它的奇怪。我刪除了sh文件並使用相同的腳本重新創建了它,並且它工作正常。現在我有一個問題,因爲這個腳本只會捕獲一個jvm的pid,但是在殺死一個pid後,其他pid正在生成。如何修改這個現有的腳本來殺死所有生成的pid,直到所有人都被殺死? – RishuA

+0

@RishuA'killall JVM'? – andlrc