大家好,
我正在尝试编写一个 bash 脚本来显示 java 的所有进程,但是我希望它以下面的方式显示。
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
上述问题是它只显示一个特定的 PID。
所以我想ps aux|grep j\[a\]va
获取每个的 PID,然后在上面的命令中运行每个 PID。
结果:
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
我猜测会形成某种类似 for 循环的循环?
答案1
虽然我不能测试这个,但这应该可以工作。 read
是 shell 脚本的一个标准部分,它将来自 stdin(可以是流,也可以是设备,例如 /dev/tty)的内容放入变量中。然后你只需执行一个 while 循环
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
或者更简单地说,如果你的 UNIX 有 pgrep:
pgrep java | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
有时您可以xargs
在这些情况下使用。请记住,默认情况下,xargs 会在命令末尾放置一组参数。因此,您需要一次输入一个参数(使用 -n1),并使用 -i 将 PID 放置在您想要的位置:
pgrep java | xargs -n1 -i{} ps -p {} -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
(再次,如果我的 -i 语法错误,请原谅,我现在无法测试。如果出现问题,请检查手册页)