2016-11-13 30 views
0

我正在使用ps命令来监视某些进程。不过,我希望将时间输出作为Unix时间戳记。ps start_time as timestamp

我使用的命令:

ps -eo class,s,user,pid,pcpu,stat,start_time,cputime,args --sort=class | \ 
    awk '$1 != "RR" && $1 != "FF" {print $0; next } 0' 

谢谢!

回答

2

使用etimes选项(经过的时间进程开始,以秒为单位)和awksystime()函数返回以秒为当前的时间戳。

假设第七列是etimes,那么AWK表达应该是这样的:

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

样本输出

TS S root 1 0.0 Ss 1479001705 00:00:01 init [3] 
TS S root 2 0.0 S 1479001705 00:00:00 [kthreadd] 
TS S root 3 0.0 S 1479001705 00:00:00 [ksoftirqd/0] 

注意,有不需要脚本中的next语句,因为它的用途是立即停止处理当前记录并继续下一条记录,并且没有语句(模式 - 动作对)在脚本结尾跳过。

+0

实际上Q中有'next'后面有另一个脚本元素,即'0'。但它永远不会匹配,所以仍然不需要“下一个”。 –