บน 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กระบวนการที่เปิดตัวและตรวจสอบไฟล์บางส่วนหรือมันเป็นสิ่งที่อยู่กับฮาร์ดแวร์หรือ?

ฉันใช้ Ubuntu 14.04


ฉันค่อนข้างมั่นใจว่าการประทับเวลาที่คุณเห็นที่ด้านบนของบันทึกจากการบูตคือเวลาที่ syslog daemon ได้รับข้อความที่จะเข้าสู่ระบบ นั่นไม่ใช่สิ่งเดียวกับเมื่อระบบเปิดทำงานหรือแม้กระทั่งสิ่งเดียวกับที่เคอร์เนลเริ่มต้น
CVN

เท่าที่ฉันรู้systemd-analyze blameยังมีเวลาก่อนเคอร์เนล init อย่างน้อยใน uefi
Max Ried

ด้วย tuptime คุณจะได้ผลลัพธ์ที่ชัดเจนและเรียบง่าย
Rfraile

1
@Rikr ที่น่าสนใจ! อย่างไรก็ตามฉันไม่พบคำสั่งนี้ในเครื่องของฉัน มันเป็นโครงการ GitHub นี้หรือไม่?
fedorqui

@fedorqui ใช่มันเป็นในgithub.com/rfrail3/tuptimeหรือภายใน Debian ในยืดหรือซิด
Rfraile

คำตอบ:


79

ในระบบของฉันมันได้รับ uptime จาก/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 manpage :

   /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 เป็นส่วนต่อประสานกับเคอร์เนล


ในซอร์สโค้ดเคอร์เนลของ linux ของไฟล์fs/proc/uptime.cที่บรรทัดที่ 49คุณจะเห็นการเรียกใช้ฟังก์ชัน:

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

สิ่งนี้จะสร้างรายการระบบไฟล์ proc ที่เรียกว่าuptime(โดยปกติจะติดตั้งอยู่ใต้ procfs /proc) และเชื่อมโยงฟังก์ชั่นซึ่งกำหนดการทำงานของไฟล์ที่ถูกต้องในไฟล์เทียมและฟังก์ชั่นที่เกี่ยวข้อง ในกรณีของ uptime เป็นเพียงread()และopen()การดำเนินงาน อย่างไรก็ตามหากคุณติดตามฟังก์ชั่นย้อนกลับคุณจะสิ้นสุดที่นี่ซึ่งคำนวณเวลาการใช้งาน


ภายในมีตัวจับเวลา interupt ซึ่งปรับปรุงระบบ uptime เป็นระยะ (นอกเหนือจากค่าอื่น ๆ ) ช่วงเวลาที่ตัวจับเวลา inter-ticks ถูกกำหนดโดย preprocessor-macro HZซึ่งมีค่าที่แน่นอนถูกกำหนดในไฟล์เคอร์เนลconfigและนำไปใช้ในเวลารวบรวม

เวลาที่ไม่ได้ใช้งานและจำนวนรอบของ CPU รวมกับความถี่HZ(รอบต่อวินาที) สามารถคำนวณได้ในจำนวน (ของวินาที) นับตั้งแต่การบู๊ตครั้งสุดท้าย


เพื่อตอบคำถามของคุณ: “ เวลาทำงาน” เริ่มนับเมื่อใด

เนื่องจาก uptime เป็นค่าภายในเคอร์เนลซึ่งทำเครื่องหมายทุกรอบจึงเริ่มนับเมื่อเคอร์เนลเริ่มต้น นั่นคือเมื่อรอบแรกสิ้นสุดลง แม้ก่อนที่จะมีการติดตั้งอะไรก็ตามหลังจาก bootloader ให้การควบคุมกับเคอร์เนลอิมเมจ


2
+1, @chaos จะแม่นยำกว่าหรือไม่ที่จะบอกว่าตัวนับเวลาทำงานเริ่มต้นเมื่อติดตั้งตัวจัดการขัดจังหวะตัวจับเวลา เคอร์เนลกำหนดค่าตัวจัดการนี้หรือไม่?
เปรม

3
@Prem มันเป็นส่วนหนึ่งของการเริ่มต้นเคอร์เนล ก่อนการกำหนดค่าเริ่มต้นของตัวกำหนดการทำงานอินเทอร์รัปต์ตัวจับเวลาจะลงทะเบียน มันเป็นตัวจับเวลาที่ขัดจังหวะซึ่งเรียกการวนซ้ำครั้งแรกของรหัสตัวกำหนดตารางเวลา (เพียงแค่การเรียกใช้ฟังก์ชัน) หากคุณถูกขัดจังหวะสิ่งนี้จะเป็นการอ่านที่ดี: github.com/0xAX/linux-insides/blob/master/Initialization/ …
ความโกลาหล

แต่บางครั้งค่าสถานะการออนไลน์ที่ส่งคืนจากเคอร์เนลอาจไม่เหมือนกันเสมอไป ตามที่คำนวณได้ทันทีไม่บูตถ้าเซิร์ฟเวอร์รันการซิงค์เวลาหรืออยู่ภายใต้การโหลดจำนวนมากค่านี้สามารถเปลี่ยนแปลงได้เนื่องจากการเลื่อนบน HZ
Rfraile

10

ตราบใดที่ฉันรู้ก็uptimeใช้/proc/uptimeในการคำนวณ 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แล้วคำนวณเวลานับจากนั้น

*) uptimeเป็นลิงค์ไปยังwโปรแกรมและเปิดตัวโดย BSD ราวปี 1980


อืมฉันไม่พบ/var/adm/utmpxในระบบของฉัน ในความเป็นจริงไม่ได้/var/adm
fedorqui

3
ในกรณีเช่นนี้คุณควรพูดถึงระบบปฏิบัติการที่คุณใช้
schily

ความผิดของฉัน! มันคือ Ubuntu 14.04
fedorqui

ตกลงบน Solaris, AIX, HP-UX และ * BSD โดยที่การwปรับใช้ดั้งเดิมนั้นใช้สิ่งต่าง ๆ ด้วยวิธีนี้ แต่ Linux มักจะทำสิ่งที่แตกต่างออกไปเล็กน้อย
schily

4
ผมคิดว่าโดยมาตรฐาน , คุณหมายถึงแบบดั้งเดิม มาตรฐาน Unix ไม่ได้ระบุuptimeคำสั่ง แต่เพียงผู้เดียวว่าควรจะใช้งานอย่างไร AFAICT, OS / X ไม่มี / var / adm / utmpx เช่นกัน และบางระบบที่ใช้ Linux ได้รับการรับรองตาม Unix
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.