Angenommen, ich habe ein Bash-Skript namens log.sh
. In diesem Skript möchte ich Eingaben von einer Pipe einlesen, aber ich möchte auch den Befehl kennen, der zum Weiterleiten von Eingaben in mich verwendet wird. Beispiel:
tail -f /var/log/httpd/error | log.sh
Im Shell-Skript möchte ich den Befehl kennen tail -f /var/log/httpd/error
.
Antworten:
Akira schlug vor, zu verwenden
lsof
.So könnten Sie es schreiben:
whatpipe2.sh
Ausführen:
Eine andere Möglichkeit ist die Verwendung von Prozessgruppen.
whatpipe1.sh
Ausführen:
Beachten Sie, dass beide nur funktionieren, wenn der Befehl auf der linken Seite der Pipe lange genug ausgeführt wird, um ihn
ps
zu sehen. Sie sagten, Sie hätten es verwendettail -f
, daher bezweifle ich, dass dies ein Problem ist.quelle
Die Pipe wird als Eintrag in der Liste der offenen Dateideskriptoren Ihres Prozesses angezeigt:
Sie könnten auch etwas verwenden wie:
Also, als Sie die Inode der Pipe haben :) können Sie jetzt jeden anderen Prozess unter
/proc/
nach dieser Pipe durchsuchen . Dann haben Sie den Befehl, der an Sie weitergeleitet wird:in diesem Beispiel
cat
an Stationen weitergeleitetsh
. In/proc/29889
finden Sie eine Datei namens,cmdline
die Ihnen sagt, wie genau sie aufgerufen wurde:Die Felder der Kommandozeile sind durch NUL getrennt, daher sieht es etwas hässlich aus :)
quelle
Hier ist eine kompakte Lösung, die
lsof
moderne Linux-Distributionen verwendet:Dadurch werden die Endpunktdateien (
+E
) von FD 0 im aktuellen Shell-Prozess (-p $$ -a -d 0
) aufgelistet und die Ausgabe auf nur PIDs (-t
) beschränkt, wodurch die PIDs auf beiden Seiten der Pipe erhalten werden.Beachten Sie, dass:
{ echo Hi; sleep 5 ; } | whatpipe.sh
ergibt sich wahrscheinlich abash
(die Eingangsunterschale) undsleep 5
.+E
ist nur verfügbar, wennlsof
mit kompiliert wurde-DHASUXSOCKEPT
. Das sollte für die meisten modernen Linux-Distributionen gelten, aber überprüfen Sie Ihre Installation trotzdem mit:lsof -v 2>&1 | grep HASUXSOCKEPT
quelle