linux获取正确时间,Linux下获取进程正确的启动时间的几种方法

1.使用ps显示的进程运行后到现在经过的时间进行计算(Via)

Script by ihipop

[bash]#!/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"[/bash]

AkZLlj7CIAANfa2.png

2.通过procfs里面的jiffies时间计算(Via)

在Linux系统中,时间管理有两个基本概念:xtime和jiffies。

xtime主要给time系函数使用,结构比较简单(include\linux\time.h):

struct timespec {

time_ttv_sec;/* seconds */

longtv_nsec;/* nanoseconds, 纳秒,以前的版本是微秒*/

};

1

2

3

4

structtimespec{

time_ttv_sec;/* seconds */

longtv_nsec;/* nanoseconds, 纳秒,以前的版本是微秒*/

};

tv_sec就是大家平常所说的unix时间戳,在CMOS中维护,关机时由电池维持正常运行。

系统启动时,通过get_cmos_time()取cmos时间赋值。运行时,通过设置系统定时器,每隔一段时间触发一个节拍,他们管这个节拍叫tick。每触发一次tick,就会通过update_wall_time_one_tick()来更新xtime。

而jiffies是内核中的一个全局变量,它的功能看起来很简单:记录从系统启动以来的tick数。

在/proc//stat中( 源码请参考proc_pid_stat(),文件是fs/proc/array.c ),维护了进程的很多状态信息,其中第22项是进程启动时的jiffies值,通过它可以计算出进程启动时,系统已经开机的时间。把这个时间加上系统启动时间(/proc/stat),就可以得到进程启动时间。

[bash]#!/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"

}

[/bash]

脚本中100是“用户可见”的tick频率(tick_rate),它的值等于我们熟悉的常量CLOCKS_PER_SEC。为什么要说“用户可见”呢?实际上,新版本的内核tick_rate,已经远高于100了(i386的是1000),但以前很多程序,都依赖于这个数。为了兼容,于是内核又做了一层封装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值