關於Linux下前後臺程序的一點疑惑(& , (cmd &), setsid )--- (kafka-stop-server.sh不工作問題)

前幾天啓動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託管了。請路過同學幫忙指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章