正确地kill java历程
正確地kill java歷程
www.MyException.Cn???發(fā)布于:2012-06-27 14:20:08???瀏覽:4次 正確地kill java進(jìn)程 在linux/unix下,你會(huì)怎么中止一個(gè)java進(jìn)程?
你可能會(huì)回答 kill -9 pid,這是一種在多數(shù)情況下正確的做法。不過(guò),這種方式過(guò)于暴力,如果用戶對(duì)環(huán)境不熟悉,很容易造成致命的后果。
本文將分析kill -9產(chǎn)生問(wèn)題的原因,并給出另一種標(biāo)準(zhǔn)的kill方式。
標(biāo)準(zhǔn)中斷信號(hào)
在Linux信號(hào)機(jī)制中,存在多種進(jìn)程中斷信號(hào)(Linux信號(hào)列表)。其中比較典型的有 SIGNKILL(9) 和 SIGNTERM(15).
SIGNKILL(9) 和 SIGNTERM(15) 的區(qū)別在于:
SIGNKILL(9) 的效果是立即殺死進(jìn)程. 該信號(hào)不能被阻塞, 處理和忽略。
SIGNTERM(15) 的效果是正常退出進(jìn)程,退出前可以被阻塞或回調(diào)處理。并且它是Linux缺省的程序中斷信號(hào)。
由此可見,SIGNTERM(15) 才是理論上標(biāo)準(zhǔn)的kill進(jìn)程信號(hào)。
那使用 SIGNKILL(9) 又有什么錯(cuò)呢?
SIGNKILL(9) 帶來(lái)的問(wèn)題
先看一段程序
/*** Shutdown Hook Presentation** @author Ken Wu*/ public class ShutdownHookTest {private static final void shutdownCallback() {System.out.println("Shutdown callback is invoked.");}public static void main(String[] args) throws InterruptedException {Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {shutdownCallback();}});Thread.sleep(10000);}} 在上面這段程序中,我使用Runtime為當(dāng)前java進(jìn)程添加了一個(gè)ShutdownHook,它的作用是在java正常退出時(shí),執(zhí)行shutdownCallback()這個(gè)回調(diào)方法。
此時(shí),如果你試驗(yàn)過(guò)在java進(jìn)程未自動(dòng)退出前,執(zhí)行 kill -9 pid,即發(fā)送 SIGNKILL 信號(hào),會(huì)發(fā)現(xiàn)這個(gè)回調(diào)接口是不會(huì)被執(zhí)行的。這是SIGNKILL信號(hào)起的作用。
對(duì)于我這個(gè)簡(jiǎn)單的測(cè)試用例來(lái)說(shuō),不被執(zhí)行也無(wú)大礙。但是,如果你的真實(shí)系統(tǒng)中有需要在java進(jìn)程退出后,釋放某些資源。
而這個(gè)釋放動(dòng)作,因?yàn)镾IGNKILL被忽略了,那就可能造成一些問(wèn)題。
所以,推薦大家使用標(biāo)準(zhǔn)的kill進(jìn)程方式,即 kill -15 pid。
總結(jié)
以上是生活随笔為你收集整理的正确地kill java历程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: kill所有java进程
- 下一篇: MFC处理回车窗口消失