前几天启动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托管了。请路过同学帮忙指正。