在本地調(diào)試agent相關(guān)功能九妈,需要經(jīng)常性的殺掉Java進(jìn)程反砌,驗(yàn)證一些極端情況。
每次都是本能執(zhí)行如下步驟
- jps
- kill -9 <pid>
- reboot
有一次驗(yàn)證萌朱,發(fā)現(xiàn)代碼中添加的ShutdownHook
沒(méi)有生效宴树,難道和kill
命令后面的數(shù)字有關(guān)?
經(jīng)過(guò)一番查閱晶疼,后面的數(shù)字代表的是具體信號(hào)酒贬,kill
命令可將指定的信號(hào)發(fā)送給相應(yīng)的進(jìn)程,linux中常見(jiàn)的信號(hào)如下:
- 1 SIGHUP 掛起進(jìn)程
- 2 SIGINT 終止進(jìn)程
- 3 SIGGQUIT 停止進(jìn)程
- 9 SIGKILL 無(wú)條件終止進(jìn)程
- 15 SIGTERM 盡可能終止進(jìn)程
- 17 SIGSTOP 無(wú)條件停止進(jìn)程翠霍,但不是終止
- 18 SIGTSTP 停止或者暫停進(jìn)程锭吨,但不終止進(jìn)程
- 19 SIGCONT 繼續(xù)運(yùn)行停止的進(jìn)程
kill
命令默認(rèn)情況使用15,下面我們驗(yàn)證下使用不同信號(hào)寒匙,有什么不同的表現(xiàn)零如。
創(chuàng)建一個(gè)springBoot應(yīng)用
啟動(dòng)類(lèi)如下,添加了一個(gè)鉤子函數(shù),當(dāng)進(jìn)程關(guān)閉時(shí)埠况,將會(huì)調(diào)用該鉤子函數(shù)耸携。
@SpringBootApplication
public class Server {
public static void main(String[] args) {
SpringApplication.run(Server.class);
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
System.out.println("do ShutdownHook.......... ");
}
});
}
}
你可以通過(guò)
java -jar ~/project/web/target/demo-1.0.jar
也可以加上nohup + &啟動(dòng)
nohup java -jar ~/project/web/target/demo-1.0.jar &
通過(guò)后者啟動(dòng),可以看到啟動(dòng)所在的目錄多了一個(gè)文件nohup.out辕翰,該文件記錄了應(yīng)用啟動(dòng)運(yùn)行過(guò)程中的日志夺衍。
&表示以后臺(tái)方式運(yùn)行應(yīng)用。但如果退出關(guān)閉啟動(dòng)的控制臺(tái)喜命,進(jìn)程將會(huì)停止沟沙。
nohup + &也是以后臺(tái)方式運(yùn)行應(yīng)用,但是退出關(guān)閉啟動(dòng)的控制臺(tái)壁榕,進(jìn)程不會(huì)停止矛紫,且進(jìn)程日志將會(huì)輸出到nohup.out中。
kill -3
通過(guò)執(zhí)行jps 拿到對(duì)應(yīng)的pid
并執(zhí)行 kill -3 5085
牌里,驚奇的發(fā)現(xiàn)颊咬,Java進(jìn)程并沒(méi)有被殺掉,而是打印了一堆線(xiàn)程信息牡辽。
kill -9
上一步的 kill -3
并沒(méi)有成功的把進(jìn)程殺掉喳篇,我們繼續(xù)使用之前的pid。
這次執(zhí)行 kill -9 5085
執(zhí)行完 -9态辛,java進(jìn)程消失了麸澜,只留下這么一段話(huà)。
kill -15
最后奏黑,再試試 kill -15
炊邦,猶豫Java進(jìn)程已經(jīng)被 -9 給kill了,需要重新啟動(dòng)一次熟史。
這一次馁害,它打印了鉤子函數(shù)中的信息,隨之進(jìn)程也消失了以故。
總結(jié)
kill -3 <pid> 這玩意一般用不到蜗细,可以打印當(dāng)前進(jìn)程的線(xiàn)程信息,但是不會(huì)關(guān)閉Java應(yīng)用怒详!
kill -9 <pid> 很暴力,不會(huì)調(diào)用鉤子函數(shù)ShutdownHook踪区。
kill <pid> 也就是kill -15 <pid> 很柔和昆烁,將會(huì)調(diào)用鉤子函數(shù)ShutdownHook,一般ShutdownHook中會(huì)進(jìn)行一些操作缎岗,比如保存數(shù)據(jù)静尼,關(guān)閉連接等。