
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 grep
und awk
akzeptieren dieStandardeingabe(STDIN) als Parameter oder Argument mithilfe einer Pipe. Andere wie und ignorieren jedoch cp
den echo
Standardeingabestream lsof
und verlassen sich ausschließlich auf dieArgumentenach dem Befehl gefunden.
Verwenden des Befehlsxargs
Sie können Befehlszeilen über die Standardeingabe erstellen und ausführen.
Antwort2
Ich würde empfehlen, xargs
wenn 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 lsof
Ausgabe:
$ 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