Mate o pai de um processo de pipe filho

2

Eu tenho um pequeno script para demonstrar o que quero fazer

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

O $! fornece o PID do processo grep. Eu quero ser capaz de matar o processo de cauda ao mesmo tempo que matar o processo do grep. Fazer kill "pid of grep" não mata o processo final. Nem killall grep . Eu poderia usar killall tail , mas acho que isso seria perigoso.

    
por user1005909 12.01.2017 / 15:50

2 respostas

3

Coloque seu comando entre parênteses:

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

Isso matará todo o subprocesso.

Aqui, especificando um PID negativo para matar, nós eliminamos todo o grupo de processos. Veja man 1 kill :

Negative PID values may be used to choose whole process groups; see the PGID column in ps command output.

Ou man 2 kill :

If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid.

No entanto, kill -PID só funcionará se o controle de trabalho estiver ativado em bash (o padrão para shells interativos ). Senão, seu subprocesso não terá um grupo de processos dedicado e o comando kill falhará com kill: (-PID) - No such process

Para contornar isso, ative o controle de trabalho em bash ( set -m ) ou use pkill -P $!

    
por 12.01.2017 / 16:15
0

Eu tentei isso e não funcionou para mim

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

Acabei de usar um pipe nomeado em vez de um pipe sem nome

rm -f tailfifo; mkfifo tailfifo
tail -n 0 -f mylog.log >tailfifo &
TAIL_PID=$!
grep --line-buffered someword <tailfifo >outputfile &
GREP_PID=$!
# .. ..
kill $TAIL_PID
kill $GREP_PID
    
por 26.07.2018 / 00:58