为什么linux下sshd被kill会导致所有子进程被终止

天上游的鱼 2011-04-02 11:33:07
问题描述:

使用securecrt远程登陆,打开两个终端,在其中一个(终端A)运行测试程序a.out;在另一个(终端B)中使用pstree可以看到

|-sshd(2555)-+-sshd(16568)---bash(16572)---pstree(16862)
| `-sshd(16635)---bash(16637)---a.out(16860)---a.out(16861)

如果在终端B中运行 kill -9 16635 后,则标红的这些进程全会终止掉


请教各方高人,这是为何?


PS: 粗略看了一下sshd的实现代码,和sshd自身应该没什么关系,父进程自己都挂了怎么会来得及处理子进程
莫非在kill -9 16635的时候,内核会检测将要结束的进程是sshd,然后干掉他的子进程?

费解啊!费解
...全文
965 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
天上游的鱼 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 steptodream 的回复:]
你把16635关闭后 那个连接就断了啊 你终端不就退出了么
[/Quote]
使用 logout、exit 命令也会断开连接,但是a.out(在后台进程组)会被init收管,并不会挂掉

另外也请教下
终端退出时会触发哪些操作?
这些操作由内核做出?
steptodream 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wlh_flame 的回复:]

主席筒子,谢谢啊
俺不是想退出终端后让程序继续运行,俺是想知道为啥 sshd挂了会导致子进程也挂了(收到HUP信号,twice)
[/Quote]
你把16635关闭后 那个连接就断了啊 你终端不就退出了么
天上游的鱼 2011-04-03
  • 打赏
  • 举报
回复
自己来结贴

google上找了好久,又看了看APUE,大致得出了结论

1. ssh远程登录时,实际上是伪终端(网络连接断开、kill掉sshd实际上都被内核感知为关闭终端)
2. 终端被关闭后,内核会给与之对应的会话首进程发送SIGHUP
会话首进程如果挂了,内核会给该会话下的所有前台进程组发送SIGHUP
而后台进程组,如果没有进程处于停止状态,是不会收到来自内核的SIGHUP的
3. bash在收到SIGHUP后会退出,但在退出前,会给各个作业(job,前后台进程组)发送SIGHUP信号

所以上面kill -9 16635 后:
-- 内核发现连接断开(伪终端关闭)
-- 给对应的控制进程(bash)发 SIGHUP
-- bash收到SIGHUP后,给各个作业发送SIGHUP,然后自己退出
-- a.out收到来自bash的SIGHUP,退出




天上游的鱼 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hawk198 的回复:]

终端退出会发出信号,是你用终端启动的那些程序全部会随着session的退出收到退出信号,如果它们不是用特殊方式启动的,将会随之退出
[/Quote]

那你觉得,直接 kill -9 掉会话首进程(16637)后结果是怎样的呢?
我自己实验结果是 a.out 会被init接管
  • 打赏
  • 举报
回复
baidu google一下看看
hawk198 2011-04-03
  • 打赏
  • 举报
回复
终端退出会发出信号,是你用终端启动的那些程序全部会随着session的退出收到退出信号,如果它们不是用特殊方式启动的,将会随之退出
天上游的鱼 2011-04-02
  • 打赏
  • 举报
回复
主席筒子,谢谢啊
俺不是想退出终端后让程序继续运行,俺是想知道为啥 sshd挂了会导致子进程也挂了(收到HUP信号,twice)
steptodream 2011-04-02
  • 打赏
  • 举报
回复
在运行的时候加nohup
nohup a.out

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧