लिनक्स पर, "अपटाइम" की गिनती कब से शुरू होती है?


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 चला रहा हूं।


मुझे पूरा यकीन है कि बूट से लॉग के शीर्ष पर आप जिस समय का स्टैम्प देखते हैं वह वह समय होता है जब साइनॉगल डेमॉन को लॉग होने का संदेश प्राप्त होता है। यह वैसा ही नहीं है जैसा कि जब सिस्टम चालू था, या जब कर्नेल को इनिशियलाइज़ किया गया था तब भी वही चीज़ थी।
बजे एक CVn

जहां तक ​​मुझे पता है systemd-analyze blameकि कर्नेल init से पहले का समय कम से कम uefi पर है।
मैक्स राइड

Tuptime के साथ आपको एक स्पष्ट और सरल आउटपुट मिलता है।
रफ्राईल

1
@ रिकर दिलचस्प! हालाँकि, मुझे यह आदेश मेरी मशीन में नहीं मिल रहा है। क्या यह जीथब प्रोजेक्ट है ?
फेडोरक्वी

@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/uptime, इसकी सामग्री मक्खी पर पुनर्जीवित हो जाती है। Proc फाइलसिस्टम कर्नेल का एक इंटरफ़ेस है।


फ़ाइल का लिनक्स कर्नेल स्रोत कोड में fs/proc/uptime.cपर लाइन 49 , आप एक समारोह कॉल देखें:

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

यह एक खरीद फाइलसिस्टम प्रविष्टि कहलाता है uptime( जिसे आमतौर पर रिसोर्ट्स के तहत माउंट किया जाता है /proc) कहा जाता है , और इसके लिए एक फंक्शन को जोड़ा जाता है, जो उस छद्म फाइल पर मान्य फ़ाइल संचालन और उनसे जुड़े कार्यों को परिभाषित करता है। अपटाइम के मामले में यह सिर्फ read()और open()संचालन है। हालाँकि, यदि आप फ़ंक्शन का पता लगाते हैं, तो आप यहाँ समाप्त हो जाएंगे , जहाँ अपटाइम की गणना की जाती है।


आंतरिक रूप से, एक टाइमर-इंटरप्ट है जो समय-समय पर सिस्टम अपटाइम (अन्य मूल्यों के अलावा) को अपडेट करता है। अंतराल, जिसमें टाइमर-इंटरप्ट टिक, प्रीप्रोसेसर-मैक्रो द्वारा परिभाषित किया गया है HZ, जिसका सटीक मान कर्नेल कॉन्फ़िगरेशन फ़ाइल में परिभाषित किया गया है और संकलन समय पर लागू किया गया है।

HZअंतिम बूट के बाद से आवृत्ति (चक्र प्रति सेकंड) के साथ संयुक्त निष्क्रिय समय और सीपीयू चक्र की संख्या की गणना की जा सकती है।


अपने प्रश्न को संबोधित करने के लिए: "अपटाइम" की गिनती कब से शुरू होती है?

चूँकि अपटाइम एक कर्नेल आंतरिक मूल्य है, जो हर चक्र पर टिक करता है, यह तब गिना जाने लगता है जब कर्नेल ने इनिशियलाइज़ किया होता है। अर्थात्, जब पहला चक्र समाप्त हो गया है। कुछ भी माउंट होने से पहले, सीधे बूटलोडर कर्नेल छवि को नियंत्रण देता है।


2
+1, @chaos, क्या यह कहना अधिक सटीक होगा कि टाइमर बाधित हैंडलर स्थापित होने पर अपटाइम काउंटर शुरू होता है? क्या कर्नेल इस हैंडलर को कॉन्फ़िगर करता है?
प्रेम

3
@ पेपर यह कर्नेल इनिशियलाइज़ेशन का हिस्सा है। शेड्यूलर इनिशियलाइज़ेशन से ठीक पहले, टाइमर इंटरप्ट पंजीकृत किया जाएगा। यह टाइमर इंटरप्ट है जो शेड्यूलर कोड के पहले पुनरावृत्ति (केवल एक फ़ंक्शन कॉल द्वारा) को कॉल करता है। यदि आप इंटरसेस्ट कर रहे हैं, तो यह एक अच्छा पढ़ा है: github.com/0xAX/linux-insides/blob/master/Initialization/…
chaos

लेकिन कभी-कभी कर्नेल से लौटा हुआ अपटाइम मूल्य हमेशा समान नहीं होता है। जैसा कि फ्लाई पर गणना की जाती है, बूट पर नहीं, अगर सर्वर कुछ समय सिंक चला रहा है, या भारी लोड के तहत है, तो यह मान बदल सकता है, एचजेड पर बदलाव के कारण।
रफ्राईल

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की गणना अपटाइम से की जाती है।
आर्केमर

2
यह सच नहीं है। ऊपर दिए गए लिंक में स्रोत कोड पर एक नज़र डालें।
जलप्रपात 12:16

6

एक मानक UNIX प्रणाली पर (मूल स्रोतों * के आधार पर), रिबूट प्रविष्टि के अंतिम समय के लिए uptimeपढ़ता है /var/adm/utmpxऔर जांचता है।

दूसरे शब्दों में: यह आपके द्वारा प्राप्त तिथि को पुनः प्राप्त कर रहा है who -bऔर तब से समय की गणना करता है।

*) कार्यक्रम की uptimeएक कड़ी है wऔर 1980 के आसपास बीएसडी द्वारा पेश किया गया था।


उह, मैं /var/adm/utmpxअपने सिस्टम में नहीं मिल सकता । वास्तव में, नहीं भी/var/adm
फेडोरक्वि

3
ऐसे मामले में, आपको यह उल्लेख करना चाहिए कि आप किस तरह के ओएस का उपयोग कर रहे हैं।
विद्वान

मेरी गलती! यह Ubuntu 14.04 है।
फेडोरक्वि

ठीक है, सोलारिस, एआईएक्स, एचपी-यूएक्स और * बीएसडी पर जहां मूल wकार्यान्वयन का उपयोग किया जाता है चीजें इस तरह से हैं, लेकिन लिनक्स आमतौर पर चीजों को थोड़ा अलग करता है।
विद्वान

4
मुझे लगता है कि मानक से , आपका मतलब पारंपरिक है । यूनिक्स मानक uptimeकमांड को निर्दिष्ट नहीं करता है , अकेले चलो इसे कैसे लागू किया जाना चाहिए। AFAICT, OS / X में / var / adm / utmpx नहीं है। और कुछ लिनक्स-आधारित प्रणालियों ने यूनिक्स-अनुपालन प्रमाणन प्राप्त किया है।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.