我想获得系统中除ps进程本身以外的所有进程的信息。
也就是说,就像:
ps --no-headers --pid 1111 -N其中1111是当前运行的ps命令的进程id。
我试过
ps --no-headers --ppid $ -N但是,当<#>not在“子进程”中运行时(如:
IFS=' ' read pctd proc <<<$(/bin/ps --no-headers --ppid $ -No pcpu,pid,comm --sort=+pcpu | tail -n 1)最后一个命令尝试使用“最近”获得CPU使用率和进程id加上进程名称。
IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | tail -1)直到最近工作还不错。然而,更新到Ubuntu23.04(或内核6.x)之后ps刚开始sometimes将自己列出为使用100% CPU.
就目前而言,以下几点似乎是一种解决办法(但并不安全):
IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | grep -v \ ps | tail -1)发布于 2023-04-22 19:28:51
要排除ps本身,请执行以下操作:
sh -c 'exec ps --no-headers --pid "$" -N'sh用它自己的PID替换了$,但是它用ps代替了自己。PID不改变,这就是exec的工作方式。这样,ps就可以接收它自己的PID作为--pid的选项参数。
注意,此方法不包括ps本身,但不包括其他ps进程(如果有的话)。
发布于 2023-04-23 11:24:29
作为对如何为自身删除ps条目的概括,特别是对于不支持非标准-N/--deselect选项的ps实现,一种常见的方法是:
print_pid_and_run() {
sh -c 'echo "$" && exec "$@"' sh
}
print_pid_and_run ps ...ps-options... |
awk 'NR == 1 {pid = $0; next}
$1 != pid'(根据传递给$1的选项,使用在ps输出中包含进程pid的实际字段更改ps)。
在zsh中,通过执行以下操作可以避免运行sh:
zmodload zsh/system
print_pid_and_run() (echo $sysparams[pid] && exec "$@")在巴什:
print_pid_and_run() (echo "$BASHPID" && exec "$@")(请记住,在bash中,与上面的zsh相反,不能用于运行内置程序或函数)。
发布于 2023-04-22 18:15:32
https://unix.stackexchange.com/questions/743701
复制相似问题