Nome del processo sull'altra estremità di un tubo unix?


8

Se due processi sono collegati da una pipe,

> cmd1 | cmd2

c'è un modo per cmd1scoprire il nome (o PID) del processo sull'altro lato del tubo ( cmd2)?

Inoltre, viceversa, c'è un modo per cmd2ottenere il nome / PID di cmd1?

So che c'è isatty(3)da verificare se l'uscita va (o l'ingresso proviene da) un terminale, quindi mi chiedevo se c'è un modo per scoprire qualcosa in più sull'altro lato.


1
Questo sarebbe al meglio specifico per piattaforma; dove stai cercando di farlo?
Michael Homer,

Starei bene con una versione specifica di Linux.
shark.dp,

5
In teoria potrebbe esserci più di un processo sull'altra estremità del tubo, se cmd2biforcato.
Nate Eldredge,

6
Anche se questo può essere possibile, dubito davvero che sia una buona idea; questa domanda ha l'odore di un problema XY.
Nate Eldredge,

@NateEldredge In effetti:cmd1 | (cmd2 & cmd3)
Barmar il

Risposte:


14

Puoi vedere la pipa dentro /proc/$PID/fd. Il descrittore è un collegamento simbolico a qualcosa di simile pipe:[188528098]. Con queste informazioni puoi cercare l'altro processo:

$ 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

Oppure, se si desidera essere certi (per l'elaborazione automatica) che il numero è il socket e non fa parte del nome di un file:

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

Con lsof4.88 e versioni successive, puoi anche utilizzare i flag -Eo +E:

In combinazione con -p <pid>, -d <descriptor>è possibile ottenere le informazioni sull'endpoint per un descrittore specifico di un determinato 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

Sopra ci dice che fd0 of shè una pipe con fd 1 of sleepall'altra estremità. Se cambi -Ea +E, ottieni anche le informazioni complete per quel fd di 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

(guarda come lsofha anche la pipa sul suo stdin)


6
Uno dovrebbe essere preparato per questo fallire; ad es. se il processo all'altro capo ha cambiato gli UID e non si dispone dell'autorizzazione lsof.
Nate Eldredge,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.