4

基本上,我想要一个 bash 脚本进程,在收到一个SIGINT,在退出之前杀死它的所有子进程。我在这里读到使用以下内容:

trap "kill -TERM -$$ ; exit 1" INT QUIT

我也读过使用kill 0

trap "kill -TERM 0 ; exit 1" INT QUIT

它们之间有什么区别,它们是否满足以下要求(如果不满足,是什么?)?:

  1. 只杀死它自己及其子进程(假设它是由终端命令启动的顶级进程)。
  2. 它不会杀死任何其他进程或同一 shell 脚本的实例(从单独的终端命令运行:即在运行时./foo.sh &then ./foo.sh,即使在同一个 tty 中,杀死第二个也不应该杀死第一个)。
4

1 回答 1

2

进程 ID 为 0 是指执行kill命令的进程的进程组。负进程 ID 指的是进程组,其 ID 是 proc ID 的绝对值。两者可能不同,因为可能会更改流程组。

对于第 1 项,它们应该是相同的(我假设您没有手动创建或影响进程组)。第 2 项不是问题,因为进程 ID 完全独立于进程中执行的脚本的名称。进程 ID 是指代特定进程的明确方式。


请注意,在进程中执行的程序的名称上撒谎是微不足道的,因此ps无论如何依赖您看到的名称通常是没有用的:

exec -a someOtherName ./myScript
于 2013-10-08T16:04:00.567 回答