您的位置:首页 > 运维架构 > Linux

关于Linux下前后台程序的一点疑惑(& , (cmd &), setsid )--- (kafka-stop-server.sh不工作问题)

2015-05-31 09:07 363 查看
前几天启动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托管了。请路过同学帮忙指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: