Bash
殺死子管道程序的父程序
我有一個小腳本來展示我想要做什麼
#!/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 $!