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

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐