Bash

殺死子管道程序的父程序

  • March 9, 2020

我有一個小腳本來展示我想要做什麼

#!/bin/bash
> z
tail -f z | grep 'd' &
echo $!

$!給出 grep 程序的 PID 。我希望能夠在殺死 grep 程序的同時殺死 tail 程序。執行kill "pid of grep"不會殺死尾部程序。也沒有killall grep。我可以使用killall tail,但我認為這會很危險。

用括號將您的命令括起來:

( tail -f z | grep 'd' ) &
kill -- -$!

這將殺死整個子程序。

在這裡,通過指定要殺死的負 PID,我們殺死整個程序組。見man 1 kill

負 PID 值可用於選擇整個程序組;請參閱 ps 命令輸出中的 PGID 列。

或者man 2 kill

如果 pid 小於 -1,則將 sig 發送到 ID 為 -pid 的程序組中的每個程序。

但是,只有在(互動式 shell 的預設設置)中啟用了作業控制kill -PID時才會起作用。否則,您的子程序將沒有專用的程序組,並且 kill 命令將失敗bash``kill: (-PID) - No such process

要解決此問題,請在bash( set -m) 中啟動作業控制,或使用pkill -P $!

引用自:https://unix.stackexchange.com/questions/336894