2009-11-02 82 views
6

如何以秒为单位确定SunOS UNIX框的正常运行时间?只需几秒钟即可获得SunOS UNIX框的正常运行时间

在Linux上,我可以简单地执行cat/proc /运行时间&采取的第一个参数:

cat /proc/uptime | awk '{print $1}' 

我试图做同样在UNIX的SunOS框,但没有的/ proc /运行时间。 有呈现以下输出的正常运行命令:

$ uptime 
12:13pm up 227 day(s), 15:14, 1 user, load average: 0.05, 0.05, 0.05 

我真的不希望有写代码的时间转换成秒只&我相信一定有人有过这样的要求,但之前我一直无法在互联网上找到任何东西。

谁能告诉我如何在几秒钟内获得正常运行时间?

TIA

+0

我不是一个大的Sun用户,但我认为有一些方法可以获得启动时间的时代格式,这很容易给你你想要的。 – 2009-11-02 12:31:06

回答

4

如果你不介意编译一个小的C程序,你可以使用:

#include <utmpx.h> 
int main () 
{ 
    int nBootTime = 0; 
    int nCurrentTime = time (NULL); 
    struct utmpx * ent; 

    while ((ent = getutxent ())) { 
    if (!strcmp ("system boot", ent->ut_line)) { 
     nBootTime = ent->ut_tv.tv_sec; 
    }  
    } 
    printf ("System was booted %d seconds ago\n", nCurrentTime - nBootTime);  
} 

来源:http://xaxxon.slackworks.com/rsapi/

+0

感谢您的支持。只是一点点挑剔:在返回之前,你需要调用endutent()。 – 2013-11-25 17:58:02

1

感谢安德烈的解决方案,将提供秒。 如果有人正在查找没有编译的答案,可以使用此脚本。注意,作为“正常运行”命令不提供秒的解决方案是从0到59秒的任何时候运行:

days=`uptime | awk '{print \$3}'` 
hrs=`uptime | awk '{print \$5}' | sed 's/[:,]/ /g' | awk '{print \$1}'` 
mins=`uptime | awk '{print \$5}' | sed 's/[:,]/ /g' | awk '{print \$2}'` 
uptimesecs=$(($mins*60)) 
uptimesecs=$(($hrs*3600+$uptimesecs)) 
uptimesecs=$(($days*86400+$uptimesecs)) 
echo "$uptimesecs seconds uptime (to within 59 secs)." 

希望这是使用的人:-)

+0

我认为这不是一个好主意,因为您正在运行正常运行时间命令3次以查找日,小时和分钟。我会建议使用kstat而不是正常运行时间。 – Space 2009-11-06 10:37:49

+0

我看过kstat,它不输出任何正常运行时间,我可以看到。 您是如何使用它来获得正常运行时间的? 当然可以通过将正常运行时间的输出存储在变量中然后从该变量中提取数据来改进脚本。尽管如此,我仍然将它作为练习读者:-) – 2009-11-11 09:33:23

0

的Perl:CPAN提供unix :: uptime - 但是,它目前不兼容SunOS,但可能在未来。

0

这是一个提供第二种解决方案的shell脚本。请注意,您需要成为root才能运行。

#!/bin/ksh 
now=$(nawk 'BEGIN{print srand()}') 
i=$(apptrace -fv 'getutxent' uptime 2>&1 | grep time_t | tail +2 | head -1 | nawk '{print $3}') 
ut=$(bc <<-%EOF% 
ibase=16 
$(print $i | sed 's/0x//' | tr "[a-f]" "[A-F]") 
%EOF% 
) 
s=$((now-ut)) 
h=$((s/3600)) 
s=$((s-(h*3600))) 
m=$((s/60)) 
s=$((s-(m*60))) 
d=$((h/24)) 
h=$((h-(d*24))) 
printf "%d seconds - %d day(s) %02d:%02d:%02d\n" $((now - ut)) $d $h $m $s 
0

您可以使用kstat来查找系统正常运行时间。

$kstat -p unix:0:system_misc:boot_time 

这将返回unix格式的值。以下是我以秒为单位获取值的代码。

#!/usr/bin/perl -w 
use strict; 

my $KSTAT = '/usr/bin/kstat -p'; 
my $STATISTIC = 'unix:0:system_misc:boot_time'; 

my $uptime = `$KSTAT $STATISTIC | awk '{print \$2}'`; 
sprintf "%0.2f\n", (time() - $uptime); 
3

一个相当非正统的方法可能是这个(帮了我,因为kstat的产生未通过的cron一些weired结果:

RunTime="" 
RunTime=`kstat -p unix:0:system_misc:snaptime | awk '{print $2}' | cut -d "." -f1` 
echo $RunTime 
RunTime=`expr $RunTime/1` 
RunDays=`expr $RunTime/86400` 
RunHours=`expr $RunTime % 86400/3600` 
RunMinutes=`expr $RunTime % 3600/60` 
RunSeconds=`expr $RunTime % 60` 

希望它可以帮助你出去 - 很好的副作用:你具有可用于计算的时间位。

+1

在脚本中使用它,打印$ 2与我的选项混淆。相反,我使用了'kstat -p unix:0:system_misc:snaptime |切-f2 |切“-d”。 -f1' – 2013-10-11 04:05:26

+0

这是不准确的区域 - 它返回全球的正常运行时间。 – Nick 2015-05-19 13:40:12

0

使用桁架解压目录的/ proc/0的创建时间。(必须以root身份运行。)

#!/bin/bash 

btime=$(truss -v lstat -t lstat ls -ld /proc/0 2>&1 | awk '/ct = /{print $9}' | cut -d. -f1) 
1

这是已经给出的一些答案的组合。只需两个命令即可输出正常运行时间。在Solaris 9和10上进行测试。

kstat -p unix:0:system_misc:boot_time | nawk '{printf "%d\n", srand()-$2}' 
0

使用日期命令上的truss来获取纪元时间并减去从kstat获得的启动时间。

expr `truss date 2>&1 |grep '^time()' |tr -cd "[0-9]"` - `kstat -p unix:0:system_misc:boot_time|cut -f2`