Trên Linux, khi nào thì uptime thời gian bắt đầu tính từ đâu?


52

Máy tính của tôi nói:

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

Và nếu tôi kiểm tra lasttôi thấy:

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

Và sau đó tôi kiểm tra:

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

Sau đó, tôi thấy trong /var/log/syslogdòng đầu tiên của ngày hôm nay là:

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

Vì vậy, tất cả dường như hội tụ trong 8:34thời gian máy của tôi đã khởi động.

Tuy nhiên, tôi tự hỏi: thời gian chính xác uptimesử dụng là gì? Là uptimemột quá trình khởi chạy và kiểm tra một số tập tin hoặc nó là một cái gì đó trên phần cứng?

Tôi đang chạy Ubuntu 14.04.


Tôi khá chắc chắn rằng dấu thời gian bạn nhìn thấy ở đầu nhật ký từ khởi động là thời điểm mà trình nền syslog nhận được thông báo sẽ được ghi lại. Điều đó không giống với khi hệ thống được bật nguồn, hoặc thậm chí giống như khi hạt nhân được khởi tạo.
một CVn

Theo như tôi biết systemd-analyze blamecũng chứa thời gian trước Kernel init, ít nhất là trên uefi.
Max Ried

Với tuptime bạn có được một đầu ra rõ ràng và đơn giản.
Rfraile

1
@Rikr thú vị! Tuy nhiên, tôi không thể tìm thấy lệnh này trong máy của mình. Đây có phải là dự án github ?
fedorqui

@fedorqui Vâng, đó là trong github.com/rfrail3/tuptime hoặc bên trong Debian ở Stretch hoặc Sid
Rfraile

Câu trả lời:


79

Trên hệ thống của tôi, nó nhận được thời gian hoạt động từ /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

Từ trang web của Proc :

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

Hệ thống tập tin Proc chứa một tập hợp các tập tin giả. Đó không phải là các tệp thực, chúng trông giống như các tệp, nhưng chúng chứa các giá trị được cung cấp trực tiếp bởi kernel. Mỗi khi bạn đọc một tập tin, chẳng hạn như /proc/uptime, nội dung của nó được tạo lại một cách nhanh chóng. Hệ thống tập tin Proc là một giao diện cho kernel.


Trong mã nguồn hạt nhân linux của tệp fs/proc/uptime.cdòng 49 , bạn thấy một lệnh gọi hàm:

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

Điều này tạo ra một mục nhập hệ thống tập tin Proc được gọi là uptime(Procfs thường được gắn bên dưới /proc) và liên kết một chức năng với nó, xác định các hoạt động tệp hợp lệ trên tệp giả đó và các chức năng liên quan đến chúng. Trong trường hợp thời gian hoạt động, nó chỉ read()open()hoạt động. Tuy nhiên, nếu bạn theo dõi các chức năng trở lại, bạn sẽ kết thúc tại đây , nơi tính thời gian hoạt động.


Trong nội bộ, có một bộ đếm thời gian ngắt cập nhật định kỳ thời gian hoạt động của hệ thống (bên cạnh các giá trị khác). Khoảng thời gian, trong đó các dấu ngắt xen kẽ hẹn giờ, được xác định bởi macro tiền xử lý HZ, có giá trị chính xác được xác định trong tệp cấu hình kernel và được áp dụng tại thời điểm biên dịch.

Thời gian nhàn rỗi và số chu kỳ CPU, kết hợp với tần số HZ(chu kỳ mỗi giây) có thể được tính bằng một số (tính bằng giây) kể từ lần khởi động cuối cùng.


Để giải quyết câu hỏi của bạn: Khi nào thì uptime thời gian bắt đầu tính từ đâu?

Vì thời gian hoạt động là một giá trị bên trong kernel, đánh dấu mỗi chu kỳ, nên nó bắt đầu đếm khi kernel đã khởi tạo. Đó là, khi chu kỳ đầu tiên đã kết thúc. Ngay cả trước khi mọi thứ được gắn kết, trực tiếp sau khi bộ nạp khởi động cung cấp quyền kiểm soát cho hình ảnh hạt nhân.


2
+1, @chaos, sẽ chính xác hơn khi nói rằng bộ đếm thời gian hoạt động bắt đầu khi trình xử lý ngắt hẹn giờ được cài đặt? Liệu kernel cấu hình trình xử lý này?
Prem

3
@Prem Đó là một phần của việc khởi tạo kernel. Ngay trước khi khởi tạo lịch trình, ngắt hẹn giờ sẽ được đăng ký. Đó là ngắt hẹn giờ gọi lần lặp đầu tiên của mã lập lịch (chỉ bằng một lệnh gọi hàm). Nếu bạn đang xen kẽ, đây là một bài đọc tốt: github.com/0xAX/linux-insides/blob/master/Initialization/ Kẻ
hỗn loạn

Nhưng đôi khi giá trị thời gian hoạt động được trả về từ kernel không phải lúc nào cũng giống nhau. Như được tính khi đang di chuyển, không phải lúc khởi động, nếu máy chủ đang chạy đồng bộ hóa thời gian hoặc đang tải nặng, giá trị này có thể thay đổi, do sự dịch chuyển trên HZ.
Rfraile

10

Miễn là tôi biết, uptimesử dụng /proc/uptimeđể tính thời gian hoạt động của hệ thống. Bạn có thể thấy nó rõ hơn trong mã nguồn 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
Tôi muốn nói rằng tập tin giả /proc/uptimeđược tính từ thời gian hoạt động.
Archemar

2
Đo không phải sự thật. Hãy xem mã nguồn trong liên kết ở trên.
Inclooder

6

Trên hệ thống UNIX tiêu chuẩn (dựa trên các nguồn ban đầu *), uptimeđọc /var/adm/utmpxvà kiểm tra lần cuối cùng của mục nhập khởi động lại.

Nói cách khác: đây là lấy ngày mà bạn cũng nhận được who -bvà sau đó tính thời gian kể từ đó.

*) uptimelà một liên kết đến wchương trình và được BSD giới thiệu vào khoảng năm 1980.


Uhms, tôi không thể tìm thấy /var/adm/utmpxtrong hệ thống của tôi. Trên thực tế, thậm chí không/var/adm
fedorqui

3
Trong trường hợp như vậy, bạn nên đề cập đến loại hệ điều hành bạn đang sử dụng.
schily

Lỗi của tôi! Đó là Ubuntu 14.04.
fedorqui

OK, trên Solaris, AIX, HP-UX và * BSD nơi wtriển khai ban đầu được sử dụng mọi thứ theo cách này, nhưng Linux thường làm mọi thứ hơi khác một chút.
schily

4
Tôi nghĩ theo tiêu chuẩn , bạn có nghĩa là truyền thống . Chuẩn Unix không chỉ định uptimelệnh, chứ chưa nói đến cách thực hiện. AFAICT, OS / X cũng không có / var / adm / utmpx. Và một số hệ thống dựa trên Linux đã nhận được chứng nhận tuân thủ Unix.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.