1.使用ps显示的进程运行后到现在经过的时间进行计算(Via)
#!/bin/bash
pid=$1
elt=$(ps w -p $pid o pid=,cmd=,etime= |awk '{print $NF}')
case $(echo $elt | sed -e 's/:/:\n/g' |grep ":" -c) in
"1")
elt=$(echo $elt |sed -e 's/:/ minutes ago /')
;;
*)
elt=$(echo $elt |sed -e 's/-/ days ago /' -e 's/:/ hours ago /' -e 's/:/ minutes ago /')
;;
esac
date -d "$elt seconds ago"
2.通过procfs里面的jiffies时间计算.
在Linux系统中,时间管理有两个基本概念:xtime和jiffies。
xtime主要给time系函数使用,结构比较简单(include\linux\time.h):
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds, 纳秒,以前的版本是微秒*/
};
tv_sec就是大家平常所说的unix时间戳,在CMOS中维护,关机时由电池维持正常运行。
系统启动时,通过get_cmos_time()取cmos时间赋值。运行时,通过设置系统定时器,每隔一段时间触发一个节拍,他们管这个节拍叫tick。每触发一次tick,就会通过update_wall_time_one_tick()来更新xtime。
而jiffies是内核中的一个全局变量,它的功能看起来很简单:记录从系统启动以来的tick数。
在/proc/
#!/bin/sh
function show_start_time( )
{
pid=$1
JIFFIES=`cat /proc/$pid/stat | cut -d" " -f22`
UPTIME=`grep btime /proc/stat | cut -d" " -f2`
START_SEC=$(( $UPTIME + $JIFFIES / $(getconf CLK_TCK)))
date -d "1970-01-01 UTC $START_SEC seconds"
}
脚本中100是“用户可见”的tick频率(tick_rate),它的值等于我们熟悉的常量CLOCKS_PER_SEC。为什么要说“用户可见”呢?实际上,新版本的内核tick_rate,已经远高于100了(i386的是1000),但以前很多程序,都依赖于这个数。为了兼容,于是内核又做了一层封装。