杀死子管道进程的父进程

use*_*909 7 bash process kill pipe

我有一个小脚本来演示我想要做什么

#!/bin/bash
> z
tail -f z | grep 'd' &
echo $!
Run Code Online (Sandbox Code Playgroud)

$!给出的grep进程的PID。我希望能够在杀死 grep 进程的同时杀死 tail 进程。这样kill "pid of grep"做不会杀死尾部进程。也没有killall grep。我可以使用,killall tail但我认为这会很危险。

xhi*_*nne 6

用括号将您的命令括起来:

( tail -f z | grep 'd' ) &
kill -- -$!
Run Code Online (Sandbox Code Playgroud)

这将杀死整个子进程。

在这里,通过指定一个负 PID 来杀死,我们杀死了整个进程组。见man 1 kill

负 PID 值可用于选择整个过程组;请参阅 ps 命令输出中的 PGID 列。

或者man 2 kill

如果 pid 小于 -1,则将 sig 发送到进程组中 ID 为 -pid 的每个进程。

然而,kill -PID只会工作,如果作业控制被启用bash(默认在交互shell)。否则,您的子进程将没有专用的进程组,并且 kill 命令将失败kill: (-PID) - No such process

要解决此问题,请在bash( set -m) 中激活作业控制,或使用pkill -P $!