Name des Prozesses am anderen Ende einer Unix-Pipe?

8

Wenn zwei Prozesse durch eine Leitung verbunden sind,

> cmd1 | cmd2

Gibt es eine Möglichkeit cmd1, den Namen (oder die PID) des Prozesses auf der anderen Seite des Rohrs ( cmd2) herauszufinden ?

Gibt es auch eine Möglichkeit cmd2, den Namen / die PID von zu ermitteln cmd1?

Ich weiß, dass isatty(3)geprüft werden muss, ob der Ausgang an ein Terminal geht (oder von einem Eingang kommt), also habe ich mich gefragt, ob es eine Möglichkeit gibt, ein bisschen mehr über die andere Seite herauszufinden.

shark.dp
quelle
1
Dies wäre bestenfalls plattformspezifisch; wo versuchst du es zu tun
Michael Homer
Ich würde mit einer Linux-spezifischen Version gut zurechtkommen.
Shark.dp
5
Theoretisch könnte es am anderen Ende des Rohrs mehr als einen Prozess geben, wenn er cmd2gegabelt wäre.
Nate Eldredge
6
Obwohl dies möglich sein mag, bezweifle ich wirklich, dass es eine gute Idee ist; Diese Frage riecht nach einem XY-Problem.
Nate Eldredge
@NateEldredge In der Tat:cmd1 | (cmd2 & cmd3)
Barmar

Antworten:

14

Sie können das Rohr in sehen /proc/$PID/fd. Der Deskriptor ist ein Symlink zu so etwas pipe:[188528098]. Mit diesen Informationen können Sie nach dem anderen Prozess suchen:

$ 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

Oder wenn Sie sicher sein möchten (für die automatische Verarbeitung), dass die Nummer der Socket und nicht Teil eines Dateinamens ist:

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

Mit lsof4,88 und oben können Sie auch die Verwendung -Eoder +EFahnen:

In Kombination mit -p <pid>, -d <descriptor>können Sie die Endpunktinformationen für einen bestimmten erhalten, Descriptor eines gegebenen 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

Oben sagen Sie uns, dass fd0 von sheine Pipe mit fd 1 von sleepam anderen Ende ist. Wenn Sie ändern -Ezu +E, erhalten Sie auch die vollständigen Informationen für das fd von 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

(siehe wie lsofhat auch das Rohr auf seinem stdin)

Hauke ​​Laging
quelle
6
Man sollte darauf vorbereitet sein, dass dies fehlschlägt; Beispiel, wenn der Prozess am anderen Ende die UIDs geändert hat und Sie keine Berechtigung dazu lsofhaben.
Nate Eldredge