7

SunOS UNIX ボックスのアップタイムを秒単位で判断するにはどうすればよいですか?

Linux では、単純に /proc/uptime を cat して最初の引数を取ることができます。

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

日付を秒単位に変換するコードを書く必要は本当にありません。誰かが以前にこの要件を持っていたに違いないと確信していますが、インターネット上で何も見つけることができませんでした。

わずか数秒でアップタイムを取得する方法を誰か教えてもらえますか?

ティア

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 に答える
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に感謝します。コンパイルせずに答えを探している人は、このスクリプトを使用できます。「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)."

それが誰かに役立つことを願っています:-)

于 2009-11-03T15:11:29.700 に答える
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

2 番目の解決策を提供するシェル スクリプトを次に示します。動作させるには 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
于 2009-11-16T09:52:07.097 に答える
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 に答える
0

Perl: CPAN は unix::uptime を提供します - ただし、現時点では SunOS と互換性がありませんが、将来的には互換性がある可能性があります。

于 2009-11-11T09:40:02.850 に答える
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 に答える