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.
cmd2
gegabelt wäre.cmd1 | (cmd2 & cmd3)
Antworten:
Sie können das Rohr in sehen
/proc/$PID/fd
. Der Deskriptor ist ein Symlink zu so etwaspipe:[188528098]
. Mit diesen Informationen können Sie nach dem anderen Prozess suchen:Oder wenn Sie sicher sein möchten (für die automatische Verarbeitung), dass die Nummer der Socket und nicht Teil eines Dateinamens ist:
Mit
lsof
4,88 und oben können Sie auch die Verwendung-E
oder+E
Fahnen:In Kombination mit
-p <pid>
,-d <descriptor>
können Sie die Endpunktinformationen für einen bestimmten erhalten, Descriptor eines gegebenen pid .Oben sagen Sie uns, dass
fd
0 vonsh
eine Pipe mit fd 1 vonsleep
am anderen Ende ist. Wenn Sie ändern-E
zu+E
, erhalten Sie auch die vollständigen Informationen für das fd vonsleep
:(siehe wie
lsof
hat auch das Rohr auf seinem stdin)quelle
lsof
haben.