7

如何在几秒钟内确定 SunOS UNIX 机器上的正常运行时间?

在 Linux 上,我可以简单地 cat /proc/uptime 并采用第一个参数:

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

我试图在 SunOS UNIX 机器上做同样的事情,但没有 /proc/uptime。有一个 uptime 命令,它显示以下输出:

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

我真的不想编写代码来仅将日期转换为秒数,而且我确信之前一定有人有过这个要求,但我在互联网上找不到任何东西。

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

TIA

4

9 回答 9

5

如果你不介意编译一个小的 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/

于 2009-11-02T12:30:41.867 回答
4

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

kstat -p unix:0:system_misc:boot_time | nawk '{printf "%d\n", srand()-$2}'
于 2014-09-04T13:51:43.650 回答
3

一个相当非正统的方法可能是这个(帮助我,因为 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`

希望它对您有所帮助 - 很好的副作用:您有可用于计算的时间位。

于 2010-03-26T15:30:37.630 回答
1

感谢 Andre 提供的解决方案,可以提供几秒钟的时间。如果有人在不编译的情况下寻找答案,可以使用此脚本。请注意,由于“正常运行时间”命令不提供秒数,因此解决方案在运行时是 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)."

希望这对某人有用:-)

于 2009-11-03T15:11:29.700 回答
0

Here is a shell script that provides second resolution. Note that you need to be root for it to work.

#!/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
于 2009-11-16T09:52:07.097 回答
0

Perl:CPAN 提供 unix::uptime - 但是,它目前与 SunOS 不兼容,但将来可能会兼容。

于 2009-11-11T09:40:02.850 回答
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);
于 2009-11-20T11:00:44.307 回答
0

使用 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)
于 2013-05-06T18:13:47.073 回答
0

在 date 命令上使用 truss 来获取纪元时间并减去从 kstat 获得的引导时间。

expr `truss date 2>&1 |grep '^time()' |tr -cd "[0-9]"` - `kstat -p unix:0:system_misc:boot_time|cut -f2`
于 2016-10-05T12:53:17.083 回答