前幾天啓動kafka時一不小心這樣操作的: $ (./bin/kafka-start-server.sh &), 後來執行 $ kafka-stop-server.sh 卻發現無法停止 kafka進程。
查看kafka-stop-server.sh這個腳本,發現裏面末尾用的是 kill -SIGINT pid. 我的理解是 SIGINT只能 kill掉和前臺程序在同一個進程組的進程,類似 ctrl+c;而我把kafka啓動成了一個非前臺進程組的後臺進程,因而kill不掉。
順便查了下資料,目前的理解如下:
以一個 ping程序爲例:
<1> $ ping www.baidu.com ===> 開啓一個前臺程序
<2> $ ping www.sohu.com & ===> 開啓一個後臺程序,但該後臺程序和當前的bash(shell)屬於一個進程組, 且屬於相同會話(session)
<3> $ (ping www.sohu.com &) ===> 開啓一個後臺程序,但該後臺程序和當前的bash(shell)不是同一個進程組(其父進程pid爲1, init), 卻屬於相同會話(session)
<4> $ setsid ping www.sohu.com ===> 開啓一個後臺程序,但該後臺程序和當前的bash(shell)既不是同一個進程組(其父進程pid爲1, init),也不是相同會話(session)
以上結論可以利用 $ ps -l | grep ping 來驗證。
有個疑惑是,針對<2>, 如果我通過 kill -9 把 ping程序的父進程,即那個當前bash進程刪掉,按道理ping進程是不是該被自動殺掉?可通過測試,我發現<2>中的ping程序最終也被init託管了。請路過同學幫忙指正。