将 cputime 的输出格式化为 ps

将 cputime 的输出格式化为 ps

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

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

ps -p $PROCID -o cputime,etimes

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

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

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

2-03:01:33 2653793

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

答案1

这会将第一次转换为秒:

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

例如,ps 命令生成:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

awk命令处理并返回:

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

解释

  • -F'[: ]+'

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

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

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

处理天数

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

2-03:01:33

然后,改用以下代码:

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

如果输出中可能会或可能不会添加日期,则使用以下组合命令:

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}'

答案2

如果你不想在游戏中引入 awk,可以使用纯 bash 解决方案(t_str 包含格式化字符串,t_sec 包含解码时间(以秒为单位)):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi

答案3

您没有指定它适用于哪个操作系统;如果是 Linux,并且考虑到您对监视特定进程感兴趣,您可能会发现它更值得解析/proc/$PROCID/stat-proc(5)有关详细信息,请参阅手册页。

相关内容