Получение времени безотказной работы SunOS UNIX всего за секунды

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

В Linux я мог бы просто cat / proc / uptime и взять первый аргумент:

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

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

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

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

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

TIA


person JF.    schedule 02.11.2009    source источник
comment
Я не большой пользователь Sun, но я думаю, что есть способы получить время загрузки в формате эпохи, который легко даст вам то, что вы хотите.   -  person Tim Post♦    schedule 02.11.2009


Ответы (9)


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

#include <stdio.h>
#include <string.h>
#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 );
  endutxent();

  return 0;
}

Источник: http://xaxxon.slackworks.com/rsapi/

person Andre Miller    schedule 02.11.2009
comment
Спасибо за это. Небольшая придирка: перед возвратом нужно вызвать endutent (). - person Giampaolo Rodolà; 25.11.2013

Это смесь уже данных ответов. Выводит время безотказной работы в секундах с помощью всего двух команд. Проверено на Solaris 9 и 10.

kstat -p unix:0:system_misc:boot_time | nawk '{printf "%d\n", srand()-$2}'
person Andreas Koppenhöfer    schedule 04.09.2014

Это может быть довольно неортодоксальный метод (помог мне, так как kstat дал некоторые странные результаты, которые не прошли cron:

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`

Надеюсь, это поможет вам - Хороший побочный эффект: у вас есть биты времени, доступные для расчетов.

person Gerhard    schedule 26.03.2010
comment
Используя это в сценарии, print $ 2 запуталась с моими параметрами. вместо этого я использовал kstat -p unix:0:system_misc:snaptime | cut -f2 | cut -d "." -f1 - person andrew lorien; 11.10.2013
comment
Это неточно для зоны - возвращает время безотказной работы глобального. - person Nick; 19.05.2015

Спасибо Андре за решение, которое предоставит секунды. Если кто-то ищет ответ без компиляции, можно использовать этот скрипт. Обратите внимание, поскольку команда "uptime" не предоставляет секунды, решение может быть от 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)."

Надеюсь, это кому-то пригодится :-)

person JF.    schedule 03.11.2009
comment
Я думаю, что это не очень хорошая идея, поскольку вы запускаете команду безотказной работы 3 раза, чтобы найти дни, часы и минуты. Я бы предложил использовать kstat вместо времени безотказной работы. - person Space; 06.11.2009
comment
Я посмотрел на kstat, и он не выводит время безотказной работы, которое я вижу. Как вы думали использовать это, чтобы увеличить время безотказной работы? Конечно, сценарий можно улучшить, сохранив вывод времени безотказной работы в переменной, а затем извлекая данные из этой переменной. Я оставлю это как упражнение для читателя :-) - person JF.; 11.11.2009

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

person JF.    schedule 11.11.2009

Вот сценарий оболочки, который обеспечивает второе разрешение. Обратите внимание, что вам необходимо иметь 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
person jlliagre    schedule 16.11.2009

Вы можете использовать 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);
person Space    schedule 20.11.2009

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

#!/bin/bash

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

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

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