2009-11-02 5 views
6

Как определить время безотказной работы в блоке SunOS UNIX за считанные секунды?Получение безотказной работы окна SunOS UNIX за считанные секунды

В Linux, я мог бы просто кошка/Proc/Провел & взять первый аргумент:

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

Я пытаюсь сделать то же самое на коробке SunOS UNIX, но нет/Proc/Провел , Существует команда Провел которая представляет следующий вывод:

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

Я не хочу, чтобы написать код, чтобы преобразовать дату в секундах только & Я уверен, что кто-то должен был иметь это требование прежде, но Я не смог найти что-либо в Интернете.

Может ли кто-нибудь сказать мне, как получить время безотказной работы всего за несколько секунд?

ТИА

+0

Я не большой пользователь Sun, но я думаю, что есть некоторые способы получить время загрузки в формате эпохи, что легко дает вам то, что вы хотите. –

ответ

4

Если вы не возражаете компиляции небольшую программу на С, вы можете использовать:

#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

Спасибо за это. Просто немного nitpick: перед возвратом вам нужно вызвать endutent(). –

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

Я думаю, что это не очень хорошая идея, так как вы выполняете команду uptime 3 раза, чтобы найти дни, часы и минуты. Я бы предложил использовать kstat вместо времени безотказной работы. – Space

+0

Я смотрел на kstat, и он не выводит время, которое я вижу. Как вы думали использовать его, чтобы получить время безотказной работы? Конечно, сценарий может быть улучшен путем хранения выходного времени работы в переменной, а затем извлечения данных из этой переменной. Я оставлю это как упражнение для читателя, хотя :-) –

0

Perl: CPAN обеспечивает unix :: uptime - однако в настоящее время он не совместим с SunOS, но может быть в будущем.

0

Вот сценарий оболочки, который обеспечивает второе разрешение. Обратите внимание, что для этого вам нужно быть 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 дали некоторые 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 | cut -f2 | cut -d "." -f1' –

+0

Это неточно в зоне - это возвращает время безотказной работы глобальной сети. – Nick

0

Используйте бандаж для извлечения времени создания каталога/Proc/0. (Должно быть запущена как корень.)

#!/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

Использовать ферму в команде даты, чтобы получить время эпохи и вычесть время загрузки, полученное из kstat.

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