使用 bash 脚本显示 PID

使用 bash 脚本显示 PID

大家好,

我正在尝试编写一个 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 语法错误,请原谅,我现在无法测试。如果出现问题,请检查手册页)

相关内容