2009-11-02 83 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`