Убить родителя дочернего процесса конвейера

Вы можете перечислить другие сети в cli, используя nmcli.

nmcli con show

или

nmcli d

Затем нужно скопировать UUID для дальнейшего подключения к нужному интерфейсу.

nmcli c up uuid 

или

nmcli -p con up "my-eth1" ifname eth1

О ресурсах: для начала можно ознакомиться с этим: nmcli, затем можно пойти дальше и использовать nmcli_fedora23.

Кстати, вы можете глубже прорезаться через http://unix.stackexchange.com - например, connect through cli

4
12.01.2017, 17:28
3 ответа

Заключите команду в круглые скобки:

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

Это убьет весь подпроцесс.

Здесь, указав отрицательный PID для уничтожения, мы уничтожаем всю группу процессов. См. man 1 kill :

Отрицательные значения PID могут использоваться для выбора целых групп процесса; см. столбец PGID в выходных данных команды ps.

Или man 2 kill :

Если pid меньше -1, то sig отправляется каждому процессу в группе процессов с идентификатором -pid.

Однако kill -PID будет работать только , если управление заданиями включено в bash (по умолчанию для интерактивных оболочек). В противном случае у вашего подпроцесса не будет выделенной группы процессов, и команда kill завершится ошибкой с kill: (-PID) - Нет такого процесса

Чтобы обойти это, либо активируйте управление заданиями в bash ( установить -m ) или использовать pkill -P $!

6
27.01.2020, 20:57

Я попробовал это, но у меня не сработало

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

Я просто использовал именованный канал вместо безымянного канала

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
0
27.01.2020, 20:57

Ответ xhienne не работает в не -интерактивном sh (тире ). использование ()не создаст группу процессов, поэтому sh -c '(sleep 6m | sleep 8m) & kill -- -$!'не сработает.

Тем не менее, вы можете использовать ps --no-headers --format pgid:1 $!найти pgid всей трубы и убить его.

sleep 6m | sleep 8m &
pgid=`ps -ho $!`
kill -- -$pgid

Кроме того, использование ()в конвейере приведет к тому, что оболочка не создаст группу процессов.

pgid() {
    ps --no-headers --format pgid:1 $1
}

while true
do nc $ip $port
done | str2str -out tcpsvr://:5566 &
echo `pgid $!` == $$
wait
0
09.03.2020, 07:06

Теги

Похожие вопросы