格式化ps的cputime输出


13

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

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

ps -p $PROCID -o cputime,etimes

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

有没有一种方法可以以秒为单位格式化cputime,就像etime-> etimes以秒为单位获取经过时间?

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

2-03:01:33 2653793

我希望第一个参数的格式设置为秒,而不是day-hours:minutes:seconds。


您可以添加现在收到的输出和您想要接收的输出吗?
Simply_Me 2014年

@Simply_Me我已经编辑了帖子
dreadiscool 2014年

@ John1024是的,那就是天数。
dreadiscool

Answers:


9

这会将第一次转换为秒:

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

如果我弄错了,请原谅我,但看起来这条命令似乎没有考虑到几天,也可以在此之前加上
dreadiscool

没错:我的系统没有显示任何进程的工作日。我可以猜测可能是什么样的日子,但是您可以提供一个实际的例子吗?
2014年

2-03:01:33是2天,3小时,1分钟和33秒。日子并非总是如此。在我的系统上,仅当该过程已经存在24小时以上时,才进行添加。到目前为止,感谢您的帮助,我非常感谢
dreadiscool 2014年

@ user1772510答案已更新为可处理的天数。
John1024

感谢您的所有帮助,如果我可以投票,我也会投票(该社区的代表人数不足),我深表感谢!
dreadiscool 2014年

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

0

您没有指定这是针对哪个操作系统的。如果是Linux,并且您有兴趣监视特定的进程,则可能更值得解析/proc/$PROCID/stat- proc(5)有关详细信息,请参见手册页。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.