Имя процесса на другом конце канала Unix?

8

Если два процесса связаны трубой,

> cmd1 | cmd2

есть ли способ cmd1узнать имя (или PID) процесса на другой стороне канала ( cmd2)?

Также, наоборот, есть ли способ cmd2получить имя / PID cmd1?

Я знаю, что isatty(3)нужно проверить, идет ли вывод на терминал (или поступает с него), поэтому я подумал, есть ли способ узнать немного больше о другой стороне.

shark.dp
источник
1
В лучшем случае это будет зависеть от платформы; где ты пытаешься это сделать?
Майкл Гомер
Я был бы в порядке с конкретной версией для Linux.
shark.dp
5
Теоретически на другом конце трубы может быть несколько процессов, если они cmd2разветвлены.
Нейт Элдридж
6
Хотя это может быть возможно, я действительно сомневаюсь, что это хорошая идея; этот вопрос пахнет проблемой XY.
Нейт Элдридж
@NateEldredge Действительно:cmd1 | (cmd2 & cmd3)
Бармар

Ответы:

14

Вы можете увидеть трубу в /proc/$PID/fd. Дескриптор является символической ссылкой на что-то вроде pipe:[188528098]. С этой информацией вы можете искать другой процесс:

$ lsof -n | grep -w 188528098
sleep      1565   hl    1w     FIFO    0,12     0t0  188528098 pipe
sleep      1566   hl    0r     FIFO    0,12     0t0  188528098 pipe

Или, если вы хотите быть уверены (для автоматической обработки), что номер является сокетом, а не частью имени файла:

$ lsof -n | awk 'NF==9 && $5=="FIFO" && $9=="pipe" && $8==188528098'

С lsof4.88 и выше, вы также можете использовать -Eили +Eфлаги:

В сочетании с -p <pid>, -d <descriptor>вы можете получить информацию о конечной точке для конкретного дескриптора данного pid .

$ sleep 1 | sh -c 'lsof -E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sh      27176 chazelas    0r  FIFO   0,10      0t0 2609460 pipe 27175,sleep,1w

Выше говорилось, что fd0 of sh- это труба с fd 1 of sleepна другом конце. Если вы измените -Eна +E, вы также получите полную информацию для этого fd из sleep:

$ sleep 1 | sh -c 'lsof +E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   27066 chazelas    1w  FIFO   0,10      0t0 2586272 pipe 27067,sh,0r 27068,lsof,0r
sh      27067 chazelas    0r  FIFO   0,10      0t0 2586272 pipe 27066,sleep,1w

(Посмотрите, как lsofтакже имеет трубу на своем стандартном)

Хауке Лагинг
источник
6
Нужно быть готовым к этому, чтобы потерпеть неудачу; например, если процесс на другом конце изменил UID, и у вас нет разрешения на lsofэто.
Нейт Элдридж