我目前正在使用ps
命令来监控某些进程。但是,我想把时间输出作为Unix时间戳。
我正在使用的命令:
ps -eo class,s,user,pid,pcpu,stat,start_time,cputime,args --sort=class | \
awk '$1 != "RR" && $1 != "FF" {print $0; next } 0'
谢谢!
答案 0 :(得分:3)
使用etimes
选项(自启动进程以来经过的时间,以秒为单位)和awk
的{{1}}函数,以秒为单位返回当前时间戳。
假设第7列是systime()
,那么AWK表达式应如下所示:
etimes
示例:
NR == 1 ? "TIMESTAMP" : systime() - $7
示例输出
ps -eo class,s,user,pid,pcpu,stat,etimes,cputime,args --sort=class | awk \
'$1 != "RR" && $1 != "FF" {print $0, NR == 1 ? "TIMESTAMP" : systime() - $7 }'
如果您要替换第七列,只需覆盖CLS S USER PID %CPU STAT ELAPSED TIME COMMAND TIMESTAMP
TS S root 1 0.0 Ss 1717 00:00:01 init [3] 1479001705
TS S root 2 0.0 S 1717 00:00:00 [kthreadd] 1479001705
TS S root 3 0.0 S 1717 00:00:00 [ksoftirqd/0] 1479001705
变量:$7
。
如果应该进一步解析命令的结果,我会删除带有$7 = systime() - $7
选项的标题,例如:
--no-headers
示例输出
ps --no-headers -eo class,s,user,pid,pcpu,stat,etimes,cputime,args \
--sort=class | awk '$1 != "RR" && $1 != "FF" { $7 = systime() - $7; print }'
注意,脚本中不需要next
语句,因为它的目的是立即停止处理当前记录并继续下一条记录,并且没有语句(模式 - 动作对) )在脚本结束时跳过。