Linux에서 "업타임"은 언제부터 시작됩니까?


52

내 컴퓨터는 말합니다 :

$ uptime
 10:20:35 up  1:46,  3 users,  load average: 0,03, 0,10, 0,13

그리고 확인하면 last다음을 볼 수 있습니다.

reboot   system boot  3.19.0-51-generi Tue Apr 12 08:34 - 10:20  (01:45)    

그런 다음 확인합니다.

$ ls -l /var/log/boot.log 
-rw-r--r-- 1 root root 4734 Apr 12 08:34 boot.log

그런 다음 /var/log/syslog오늘의 첫 번째 줄 에서 봅니다 .

Apr 12 08:34:39 PC... rsyslogd: [origin software="rsyslogd" swVersion="7.4.4" x-pid="820" x-info="http://www.rsyslog.com"] start

따라서 모든 것이 8:34내 컴퓨터가 부팅 된 시간 에 수렴하는 것 같습니다 .

그러나 나는 시간이 정확히 무엇을 uptime사용 하는지 궁금 합니다. 가 uptime시작되고 일부 파일을 확인하거나 하드웨어에 뭔가하는 과정은?

우분투 14.04를 실행 중입니다.


부팅에서 로그 상단에 표시되는 타임 스탬프는 syslog 데몬이 기록 할 메시지를 수신 한 시간이라고 확신합니다. 그것은 시스템의 전원이 켜졌을 때와 같지 않거나 심지어 커널이 초기화 될 때와 같지 않습니다.
CVn

내가 아는 한 systemd-analyze blame, 적어도 uefi에서 커널 초기화 전의 시간이 포함되어 있습니다.
Max Ried

tuptime을 사용하면 명확하고 간단한 출력을 얻을 수 있습니다.
Rfraile

1
@Rikr 재미있는! 그러나 내 컴퓨터에서이 명령을 찾을 수 없습니다. 이 github 프로젝트 입니까?
fedorqui

@fedorqui 네, 그것은 github.com/rfrail3/tuptime에 있거나 스트레치 또는 시드 데비안 안에 있습니다
Rfraile

답변:


79

내 시스템에서는 가동 시간이 /proc/uptime다음 과 같습니다.

$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY)         = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY)         = 4
 10:52:38 up 3 days, 23:38,  4 users,  load average: 0.00, 0.02, 0.05

로부터 PROC 맨 :

   /proc/uptime
          This file contains two numbers: the uptime of the system
          (seconds), and the amount of time spent in idle process
          (seconds).

proc 파일 시스템은 의사 파일 세트를 포함합니다. 그것들은 실제 파일이 아니며 단지 파일처럼 보이지만 커널이 직접 제공하는 값을 포함합니다. 와 같은 파일을 읽을 때마다 파일 /proc/uptime내용이 즉시 재생성됩니다. proc 파일 시스템은 커널에 대한 인터페이스입니다.


파일의 리눅스 커널 소스 코드 fs/proc/uptime.c라인 49 , 당신은 함수 호출을 참조하십시오

proc_create("uptime", 0, NULL, &uptime_proc_fops);

이것은 생성 proc 파일 시스템 엔트리 라고 불리는 uptime(보통 procfs의 아래에 장착된다 /proc), 및 유효한 파일이 의사 파일에 대한 조작 및 그와 연관된 기능을 정의하고 그것을 함수를 연관시킨다. 가동 시간의 경우 그것은 단지 read()open()작업을. 그러나 함수를 다시 추적 하면 가동 시간이 계산되는 여기 가 종료됩니다 .


내부적으로 시스템 가동 시간을 주기적으로 업데이트하는 타이머 인터럽트가 있습니다 (다른 값 제외). 타이머 인터럽트 틱이 발생하는 간격 HZ은 정확한 값이 커널 구성 파일에 정의되어 컴파일 타임에 적용되는 전 처리기 -macro에 의해 정의됩니다 .

유휴 시간 및 CPU주기 수와 빈도 HZ(초당주기)는 마지막 부팅 이후 수 (초)로 계산할 수 있습니다.


질문을 해결하려면 : "가동 시간"은 언제부터 시작됩니까?

가동 시간은 커널 내부 값이므로 매주기마다 작동하므로 커널이 초기화 될 때 계산을 시작합니다. 즉, 첫 번째 사이클이 종료 된 시점입니다. 부트 로더가 커널 이미지에 제어권을 부여한 직후에 어떤 것이 든 마운트되기 전에도.


2
+1, @chaos 타이머 인터럽트 핸들러가 설치 될 때 가동 시간 카운터가 시작된다고 말하는 것이 더 정확합니까? 커널이이 핸들러를 구성합니까?
Prem

3
@Prem 커널 초기화의 일부입니다. 스케줄러 초기화 직전에 타이머 인터럽트가 등록됩니다. 스케줄러 코드의 첫 번째 반복을 호출하는 타이머 인터럽트입니다 (함수 호출만으로). : 당신이 interessted하는 경우, 이것은 좋은 읽기입니다 github.com/0xAX/linux-insides/blob/master/Initialization/...
혼돈

그러나 때로는 커널에서 반환되는 가동 시간 값이 항상 동일하지는 않습니다. 부팅 시가 아니라 즉석에서 계산 된대로 서버가 시간 동기화를 실행 중이거나로드가 많은 경우이 값은 HZ의 이동으로 인해 변경 될 수 있습니다.
Rfraile

10

내가 아는 한 시스템 가동 시간을 계산하는 uptime데 사용 /proc/uptime합니다. 소스 코드 uptime.c 에서 더 명확하게 볼 수 있습니다.

  FILE *fp;

  fp = fopen ("/proc/uptime", "r");
  if (fp != NULL)
    {
      char buf[BUFSIZ];
      char *b = fgets (buf, BUFSIZ, fp);
      if (b == buf)
        {
          char *end_ptr;
          double upsecs = c_strtod (buf, &end_ptr);
          if (buf != end_ptr)
            uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t)
                      ? upsecs : -1);
        }

      fclose (fp);
    }

1
오히려 의사 파일 /proc/uptime은 가동 시간에서 계산 된다고 말하고 싶습니다 .
Archemar

2
그건 사실이 아니야. 위의 링크에서 소스 코드를 살펴보십시오.
Inclooder

6

표준 UNIX 시스템 (원본 소스를 기반으로 *) 에서 마지막 재부팅 항목을 uptime읽고 /var/adm/utmpx확인합니다.

다시 말해, 이것은 당신이 가진 날짜를 검색 who -b한 다음 그 이후의 시간을 계산합니다.

*) uptimew프로그램에 대한 링크 이며 1980 년경 BSD에 의해 소개되었습니다.


음, /var/adm/utmpx내 시스템에서 찾을 수 없습니다 . 실제로, 심지어 짝수/var/adm
fedorqui

3
이 경우 사용중인 OS 종류를 언급해야합니다.
schily

내 잘못! 우분투 14.04입니다.
fedorqui

원래 w구현이 사용되는 Solaris, AIX, HP-UX 및 * BSD에서는 이런 방식이지만 Linux는 일반적으로 약간 다릅니다.
schily

4
나는 표준으로 생각한다 , 당신은 전통 을 의미한다 . 유닉스 표준은 uptime명령 구현 방법 뿐만 아니라 명령을 지정하지 않습니다 . AFAICT, OS / X에는 / var / adm / utmpx도 없습니다. 그리고 일부 Linux 기반 시스템은 Unix 준수 인증을 받았습니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.