【问题标题】:parent process and child process relationship in Linux bash scriptLinux bash脚本中的父进程和子进程关系
【发布时间】:2014-01-18 14:53:00
【问题描述】:

我有一个关于 linux 进程的问题,我想不通。
这个问题来自《Advanced Bash Script》这本书,代码在这里:(我已经简化了)

#! /bin/bash
# spawn.sh
sleep 1
sh $0   # fork a child process here and into infinite loop

exit 0  # the script will never come here

当我在shell中运行./spawn.sh时,进程会卡在那里,一段时间后那里会有很多“sh spawn.sh”进程。
我认为现在流程之间的关系是这样的:

./spawn.sh 进程(pid: 10000) ---> 子进程(pid: 10001) ---> 子进程(pid:1002) --->子进程(pid:1003) --- > 等等

当我在 Shell 中按下 Control-C 时,父进程结束了,其所有子进程也结束了。这是我无法理解的地方。为什么所有经过处理的孩子都会灭亡?我认为进程之间的关系应该是这样的:

init(pid: 1) ---> 子进程(pid: 10001) ---> 子进程(pid:1002) --->子进程(pid:1003) ---> 以此类推

但事实是,好像父进程在结束时向它的子进程发送一个信号,从而导致所有子进程一个接一个地灭亡。这是正常的还是shell脚本的功能?

非常感谢您。

【问题讨论】:

    标签: linux bash shell process pid


    【解决方案1】:

    当我在 Shell 中按下 Control-C 时,父进程结束,并且 它的所有子进程也都结束了。这是我做不到的地方 理解。为什么所有处理过的孩子都会灭亡

    当您按下 Ctrl-C 时,SIGINT 不仅会发送到父进程,还会发送到整个进程组。这意味着所有三个进程都获得了 SIGINT,因此它们会死掉。要查看此操作,请添加一个

    trap "process $$ exiting" INT
    

    让孩子不会对父母的死亡做出反应的一种快速方法是让脚本产生一个孩子,然后杀死父母。

    【讨论】:

    • 非常感谢!我仍然想知道为什么“SIGINT 将被发送到整个进程组”?这是shell脚本的实现方式还是Linux中的常见实现?
    • @ruanhao 据我所知,所有 Unices 都这样做。发送信号的不是外壳,而是终端驱动程序。
    • 我发现了一件事:当我按下 Control-C 时,所有进程都会被杀死。但是当我在另一个shell中输入'kill -2 '时,没有效果,没有进程被杀死。当我使用 SIGKILL(9) 杀死父进程时,它只会杀死所有子进程都在那里的父进程。 Control-C 与“kill -2”不同吗? (我在 OSX 上做这些测试)
    • @ruanhao 这是@cnicutar提到的没有使用终端驱动发送信号的结果。使用kill绕过了终端驱动在检测到control-C时遵循的逻辑...
    【解决方案2】:

    Control-C 正在杀死最近的孩子,而不是原来的 shell。当sh $0 退出时,下一行代码也会导致当前 shell 退出,这会导致一系列已完成的进程一直返回到原始父级。

    【讨论】:

      【解决方案3】:

      我想我现在知道答案了。这是因为 Control-C 不仅会向 shell 脚本进程发送 SIGINT,还会向其子进程发送 SIGINT。由于这些进程没有捕获 SIGINT,所以就结束了。
      命令 kill -2 和 Ctrl-C 不一样,详细请看这个:http://ajhaupt.blogspot.com/2011/01/whats-difference-between-ctrl-c-and.html
      谢谢大家帮助我:)

      【讨论】:

      • 我有话要补充。 如果只有父进程结束,那么所有子进程都会被发送 SIGINT。您可以通过在父进程中插入trap '' 2 来观察这一点。因此父进程将忽略 SIGINT 并且其所有子进程仍将存在。
      猜你喜欢
      • 1970-01-01
      • 2017-04-15
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多