Guten Tag allerseits,
Ich versuche, ein Bash-Skript zu schreiben, um alle Java-Prozesse anzuzeigen. Ich hätte jedoch gerne, dass es wie folgt angezeigt wird.
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
Das Problem bei dem oben genannten ist, dass nur eine bestimmte PID angezeigt wird.
Ich möchte also ps aux|grep j\[a\]va
die PID von jedem erhalten und dann jeden PID im obigen Befehl ausführen.
ERGEBNIS:
root@reinhardt-VirtualBox:/home/reinhardt# ps -p 1959 -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
PID MEMORY USER GROUP COMMAND ARGS
1959 13648 root root grep grep --color=auto java
Ich vermute, es wird eine Art Schleife erstellt, ähnlich einer For-Schleife?
Antwort1
Nicht an einem Ort, an dem ich das testen kann, aber das sollte funktionieren. read
ist ein Standardteil von Shell-Skripten, es platziert etwas von stdin (das kann ein Stream oder ein Gerät wie /dev/tty sein) in eine Variable. Dann führen Sie einfach eine while-Schleife aus
ps auwwx | gawk '/[j]ava/{print $1}' | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
Oder einfacher, wenn Ihr UNIX über pgrep verfügt:
pgrep java | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
In solchen Fällen können Sie es manchmal verwenden xargs
. Denken Sie daran, dass xargs standardmäßig eine Gruppe von Argumenten an das Ende des Befehls setzt. Sie müssen es also einzeln eingeben (mit -n1) und die PID mit -i an der gewünschten Stelle platzieren:
pgrep java | xargs -n1 -i{} ps -p {} -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
(nochmals entschuldigen Sie, wenn ich die -i-Syntax falsch mache, ich kann es jetzt nicht testen. Sehen Sie auf der Manpage nach, wenn es schiefgeht)