Если два процесса связаны трубой,
> cmd1 | cmd2
есть ли способ cmd1
узнать имя (или PID) процесса на другой стороне канала ( cmd2
)?
Также, наоборот, есть ли способ cmd2
получить имя / PID cmd1
?
Я знаю, что isatty(3)
нужно проверить, идет ли вывод на терминал (или поступает с него), поэтому я подумал, есть ли способ узнать немного больше о другой стороне.
cmd2
разветвлены.cmd1 | (cmd2 & cmd3)
Ответы:
Вы можете увидеть трубу в
/proc/$PID/fd
. Дескриптор является символической ссылкой на что-то вродеpipe:[188528098]
. С этой информацией вы можете искать другой процесс:Или, если вы хотите быть уверены (для автоматической обработки), что номер является сокетом, а не частью имени файла:
С
lsof
4.88 и выше, вы также можете использовать-E
или+E
флаги:В сочетании с
-p <pid>
,-d <descriptor>
вы можете получить информацию о конечной точке для конкретного дескриптора данного pid .Выше говорилось, что
fd
0 ofsh
- это труба с fd 1 ofsleep
на другом конце. Если вы измените-E
на+E
, вы также получите полную информацию для этого fd изsleep
:(Посмотрите, как
lsof
также имеет трубу на своем стандартном)источник
lsof
это.