TCZ*_*CZ8 14 process shell-script process-groups
所以我到处都在读这个命令应该终止父进程的所有子进程:
kill -- -$$
Run Code Online (Sandbox Code Playgroud)
在 kill 命令中使用负 ID 会引用一个 PGID,并且从我看到的示例来看,子进程的 PGID 应该是父进程的 PID,但在我的系统中并非如此。
在我的系统上,子脚本的 PGID 与父脚本的 PGID 相同,结果是 bash。
这里发生了什么?示例是错误的还是我的系统设置不同?
我需要实现的是在不终止父进程的情况下终止子进程,因此我不想向父进程所在的 PGID 发送终止信号。
Bar*_*mar 12
当进程被 fork 时,它会从其父进程继承其 PGID。当进程成为进程组领导时,PGID 会发生变化,然后从其 PID 复制其 PGID。从那时起,它产生的新子进程及其后代继承该 PGID(除非它们开始自己的新进程组)。
在具有作业控制的外壳程序中,例如大多数交互式外壳程序,每个作业都放在自己的进程组中。如果您运行 shell 脚本,则运行该脚本的 shell 进程将成为组长,PGID 将等于其 PID。
在没有作业控制的 shell 中,例如大多数用于运行脚本的 shell,命令在 shell 的进程组中运行。
该语法kill -- -N
使用 PGID = N 杀死组中的所有进程。您不能将它与任意 PID 一起使用,只能使用进程组领导的 PID,因为那是 PGID。这基本上是外壳的
kill %jobid
Run Code Online (Sandbox Code Playgroud)
语法有效——它在内部转换%jobid
为作业的 PGID,并将信号发送到该 PGID。
没有简单的方法可以从另一个 shell 脚本在其自己的进程组中运行脚本。不过,请参阅如何设置 shell 脚本的进程组以获取一些建议。