Linux bash脚本中的父进程和子进程关系

Linux bash脚本中的父进程和子进程关系,linux,bash,shell,process,pid,Linux,Bash,Shell,Process,Pid,我有一个关于linux进程的问题,我想不出来。 这个问题源于《高级Bash脚本》一书,代码如下:(我简化了它) 当我在shell中运行/spawn.sh时,进程将卡在那里,过一段时间后将有很多“sh spawn.sh”进程。 我认为现在流程之间的关系如下: ./spawn.sh进程(pid:10000)--->子进程(pid:10001)--->子进程(pid:1002)--->子进程(pid:1003)--->依此类推 当我在Shell中按下Control-C时,父进程结束,并且它的所有子进程

我有一个关于linux进程的问题,我想不出来。
这个问题源于《高级Bash脚本》一书,代码如下:(我简化了它)

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

./spawn.sh进程(pid:10000)--->子进程(pid:10001)--->子进程(pid:1002)--->子进程(pid:1003)--->依此类推

当我在Shell中按下Control-C时,父进程结束,并且它的所有子进程也结束了。这是我无法理解的地方。为什么所有的儿童都会死亡?我认为流程之间的关系应该是:

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

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

事先非常感谢

当我在Shell中按下Control-C时,父进程结束,并且 它的所有子进程也都结束了。这是我不能去的地方 明白。为什么所有的儿童都会死亡

当您点击Ctrl-C时,SIGINT不仅被发送到父进程,而且被发送到整个进程组。这意味着这三个进程都会得到一个SIGINT,所以它们都会死亡。要查看此操作,请添加

trap "process $$ exiting" INT

要想让孩子们对父母的去世没有反应,一个快捷的方法是让脚本生成一个孩子,然后杀死父母。

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

我想我现在知道答案了。这是因为Control-C不仅会将SIGINT发送给shell脚本进程,而且还会发送给它的子进程。由于这些进程不捕获SIGINT,因此它们已结束。
命令kill-2与Ctrl-C不同,详细信息请参见:

谢谢所有帮助我的人:)

非常感谢!我仍然想知道为什么“SIGINT将被发送到整个进程组”?shell脚本就是这样实现的还是Linux中常见的实现方式?@ruanhao据我所知,所有Unice都是这样做的。发送信号的不是外壳,而是终端驱动程序。我发现一件事:当我按下Control-C时,所有进程都将被终止。但是当我在另一个shell中输入'kill-2'时,没有效果,没有进程被终止。当我使用SIGKILL(9)终止父进程时,它将只终止所有子进程所在的父进程。Control-C是否与“kill-2”不同?(我在OSX上做了这些测试)@ruanhao这是因为没有使用终端驱动程序来发送信号,正如@cnicutar所提到的。使用
kill
绕过终端驱动程序在检测到
control-C
时遵循的逻辑……我有一些东西要补充。如果只有父进程结束,则所有子进程都将被发送SIGINT。您可以通过在父进程中插入
陷阱“”2
来观察这一点。因此,父进程将忽略SIGINT,其所有子进程仍将在那里。
trap "process $$ exiting" INT