“kill 0”和“kill -?- -$$”有什么区别?

Mat*_*att 5 linux bash shell process process-group

基本上我想要一个 bash 脚本进程在收到 后SIGINT,在退出之前终止其所有子进程。我在这里读到的内容是:

trap "kill -TERM -$$ ; exit 1" INT QUIT
Run Code Online (Sandbox Code Playgroud)

我还阅读了使用kill 0

trap "kill -TERM 0 ; exit 1" INT QUIT
Run Code Online (Sandbox Code Playgroud)

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

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

che*_*ner 3

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

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


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

exec -a someOtherName ./myScript
Run Code Online (Sandbox Code Playgroud)