Wie übergebe ich die Ausgabe von grep an „lsof -p“?

Wie übergebe ich die Ausgabe von grep an „lsof -p“?

Ich möchte den Pfad des aktuell laufenden./a.out

Es gibt mehrere MPI-Prozesse, aber ich brauche nur eine der PIDs von mehreren ./a.out. Also verwende ich zunächst den folgenden Code, um sie zu greppen:

ps aux | grep -P "Rl.*a\.out" | grep -oP "\d+"|head -n 1

was eine PID ergibt, zum Beispiel 12345.

Jetzt möchte ich Folgendes verwenden:

lsof -p12345 

Um den Dateipfad von PID 12345 zu erfahren.

Wie kombiniere ich die beiden Schritte in einer Befehlszeile?

Antwort1

Dies ist der Befehl, den Sie benötigen:

ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1 | xargs lsof -p

Der Schlüssel hier ist xargs.

Befehle wie grepund awkakzeptieren dieStandardeingabe(STDIN) als Parameter oder Argument mithilfe einer Pipe. Andere wie und ignorieren jedoch cpden echoStandardeingabestream lsofund verlassen sich ausschließlich auf dieArgumentenach dem Befehl gefunden.

Verwenden des BefehlsxargsSie können Befehlszeilen über die Standardeingabe erstellen und ausführen.

Antwort2

Ich würde empfehlen, xargswenn ein Befehl mehrere Zeilen (oder Datensätze) zurückgibt. In diesem Fall gibt der Befehl eine einzelne PID und eine Shell-Funktion zurück, die alsBefehlsersetzungwäre eine entsprechende Lösung.

Dadurch kann die Ausgabe eines Befehls von einem anderen verwendet werden. Dies wird erreicht, indem der Befehl, der die Eingabe bereitstellt, in $(und eingeschlossen )wird. Früher wurden Backticks (`) verwendet, diese werden jedoch nicht mehr empfohlen.

lsof -p $(ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1)

Antwort3

Ihr erster komplexer Befehl zum Finden der PID basierend auf dem Namen kann ersetzt werden durch pgrep, zB

$ pgrep -nf a.out
70512

Um dann den Pfad von zu erhalten lsof, können Sie den bedingten Druck in verwenden awk.

Der Befehl könnte also lauten:

$ lsof -p $(pgrep -nf a.out) | awk '$4 == "cwd" {print $9}'

Das Obige basiert auf der folgenden lsofAusgabe:

$ lsof -p $(pgrep -nf a.out)
COMMAND   PID   USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
gsleep  70513 kenorb  cwd    DIR    1,4      1938 121793972 /my/path

verwandte Informationen