为 ps 格式化 cputime 的输出

dre*_*ool 14 bash ps text-formatting

我正在尝试编写一个脚本,该脚本可以在一段时间内监视进程的 CPU 使用情况(以创建图形)。

到目前为止,这是我正在使用的命令

ps -p $PROCID -o cputime,etimes
Run Code Online (Sandbox Code Playgroud)

我唯一担心的是 cputime 的输出似乎是[dd]hh:mm(或类似的东西,现在想不起来了)

有没有办法以秒为单位格式化 cputime,有点像 etime -> etimes 以秒为单位获取经过的时间?

编辑:这是我目前收到的输出

2-03:01:33 2653793
Run Code Online (Sandbox Code Playgroud)

我希望第一个参数以秒为单位格式化,而不是天-小时:分钟:秒。

Joh*_*024 9

这将第一次转换为秒:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
Run Code Online (Sandbox Code Playgroud)

例如, ps 命令产生:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931
Run Code Online (Sandbox Code Playgroud)

awk命令处理并返回:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931
Run Code Online (Sandbox Code Playgroud)

解释

  • -F'[: ]+'

    这告诉 awk 将冒号和空格都视为字段分隔符。这样,小时、分钟和秒显示为单独的字段。

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    初始/:/限制代码只能在包含冒号的行上工作。这将删除标题行。秒数是通过小时、分钟、秒计算出来的t=$3+60*($2+60*$1)。然后将结果值t与经过时间一起打印。

处理天数

如果ps产生天、小时、分钟、秒,如:

2-03:01:33
Run Code Online (Sandbox Code Playgroud)

然后,改用此代码:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'
Run Code Online (Sandbox Code Playgroud)

如果可能会或可能不会在输出前添加天数,请使用以下组合命令:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'
Run Code Online (Sandbox Code Playgroud)