从 ps 输出中排除 ps 本身

Fed*_*eli 6 bash debian ps

我想获取系统中ps进程本身之外的所有进程的信息。

也就是说,类似:

ps --no-headers --pid 1111 -N
Run Code Online (Sandbox Code Playgroud)

其中是当前正在运行的命令1111的进程 ID 。ps

我尝试过类似的东西

ps --no-headers --ppid $$ -N
Run Code Online (Sandbox Code Playgroud)

但是,当在“子进程”中运行时,这不起作用,例如ps

ps --no-headers --pid 1111 -N
Run Code Online (Sandbox Code Playgroud)

最后一个命令尝试获取“最近”使用最多 CPU 的进程的 CPU 使用百分比和进程 ID 以及名称。

IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | tail -1)
Run Code Online (Sandbox Code Playgroud)

直到最近都工作正常。然而,更新到 Ubuntu 23.04(或内核 6.x)后,有时ps会开始将自己列为使用 100% CPU


目前,以下似乎是一种解决方法(但并不安全):

IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | grep -v \ ps | tail -1)
Run Code Online (Sandbox Code Playgroud)

Kam*_*ski 13

排除ps自身:

sh -c 'exec ps --no-headers --pid "$$" -N'
Run Code Online (Sandbox Code Playgroud)

sh将其自己的 PID 替换为$$,但随后将其自身替换为ps。PID不改变,这就是exec工作原理。这种方式ps接收它自己的 PID 作为 的选项参数--pid

请注意,此方法排除自身 ps,但不排除其他ps进程(如果有)。

  • @FedKad `--pid` 和 `--ppid` 不等效。 (3认同)