运行脚本时,为什么非交互式 bash 进程的终止会影响或不影响其子进程?

运行脚本时,为什么非交互式 bash 进程的终止会影响或不影响其子进程?

我有一个 bash 脚本script1

#! /bin/bash
evince 

和另一个脚本script2

#! /bin/bash
evince &

当我跑步时

./script2

bash 进程在进入evince后台后立即退出,让evince进程继续运行。

当我跑步时

./script1 &

bash 进程等待evince完成运行。

如果我是killbash 进程,则 bash 进程将退出并终止该evince进程。

我想知道为什么 bash 进程的终止不会影响evince第二个脚本中的进程,但会影响第一个脚本中的进程?

fork(), exit()您能用系统调用(例如和)来解释一下wait()吗?

谢谢。

这与为什么这个在后台运行的脚本能够在调用 shell 的“kill”和终止后继续存在?,但这里我想学习基本的一般情况。

答案1

如果您确实只杀死了 shell,那么您应该针对 bash 进行错误报告。

由于现代 shell 自动启用交互式 shell 的作业控制,

./script1&

使用自己的进程组 ID 创建一个新作业。

shell 等待程序evince,如果您调用:

kill -9 $!

只有 shell 会被杀死并evince继续运行。

但是,如果您致电:

kill %1

这会杀死整个工作,包括evince.

相关内容