從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
對於更先進的工藝選擇,請參閱killall和pkill:
'if'更好地寫成'if [[「x」!=「x $ PID」]]',這確保'!='用於字符串比較(作爲獎勵,它也確保了空的'grep '在不同的shell上正確處理查詢)。 – grochmal
代碼看起來基本正確 - 您可以詳細說明「shomehow無法正常工作」的含義,但我們會假定該過程在殺死後仍然存在。如果尼爾埃利斯的回答不能幫助你,你就不得不多加解釋。 - 我從ps輸出修復字符串時的操作就像'ps -eaf | grep'[J] VM'' ..它不需要'grep -v grep',因爲grep命令與正則表達式不匹配 –