Если bash
я выполню:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
где cmd{1..n}
может быть не ясно, как я могу получить PID cmdi
? В качестве альтернативы, как я могу сигнализировать cmdi
процесс? (К примеру, отправить его SIGUSR1
?)
pkill
/ pgrep
, И pidof
т.д. не похожи на хорошие ответы, так как других случаях , cmdi
возможно , работает, в том числе в рамках одного и того же трубопровода. jobs -p
дает PID cmd1
, для меня.
i
может быть что угодно в {1..n}
.
bash
shell
pipe
job-control
Мур
источник
источник
cat /var/run/out | nc -l 8080
только внешне похож наcmd1 | cmd2
? Ваше ограничение, заключающееся в том, что вы хотите набрать простой конвейер и затем восстановить PID, (1) не указано в вопросе и (2) вряд ли позволит найти хорошее общее решение.cmd1 | cmd2
Это особый случай, когда оба PID легко доступны. Я говорил что-нибудь о п? Так почему вы предполагаете, что n = 2? Я говорил что-нибудь о том, что такое CMDI? Так почему вы предполагаете, что я могу изменить CMDI? Я прошу общее решение, а вы вводите ограничения.Ответы:
Для оригинальной версии вопроса, когда требовался только PID последней команды, специальная переменная
$!
является идеальной.Нет такого же легкого доступа к PID других процессов.
Потребовалось много времени для добавления
$pipestatus
(zsh) и$PIPESTATUS
(bash), что в итоге дало нам доступ ко всем состояниям выхода в конвейере, в дополнение к$?
последнему состоянию, которое существовало со времени первоначальной оболочки Bourne. Может быть, что-то аналогичное произойдет в$!
конце концов.источник
Я думаю, что вы могли бы сделать что-то, как предложено здесь .
Здесь, в приведенном выше примере, я получил pid третьего процесса и записал его в файл pid. Я мог бы записать это для любого процесса.
источник
jobs -p
, сигнализировать с помощьюSIGPIPE
. Хочешьcmdi
- это.Не очень переносимым, специфичным для Linux решением может быть отслеживание процессов с использованием каналов, которые их соединяют. Мы можем получить PID первой (
jobs -p
) и последней ($!
) команд в конвейере. Используя любой PID, этот скрипт может выполнить эту работу:источник
Я использую нулевые массивы здесь, в этом коде. Просто будь осторожен с тем, что проходишь мимо
eval
.источник