Linux'ta “çalışma süresi” ne zaman saymaya başlar?


52

Bilgisayarım diyor ki:

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

Ve eğer kontrol lastedersem şunu görürüm:

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

Sonra kontrol ederim:

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

Sonra /var/log/syslogbugünün ilk satırında görüyorum :

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

Öyleyse, hepsi 8:34makinemin önyükleme zamanı olarak birleşiyor gibi görünüyor .

Ancak, merak ediyorum: tam olarak ne zaman uptimekullanır? Mı uptimebaşlattı ve bazı dosyayı denetler veya donanım üzerinde bir şeydir bir süreci?

Ubuntu 14.04 kullanıyorum.


Günlüğün en üstünde açılışta gördüğünüz zaman damgasının syslog arka plan programının günlüğe kaydedilecek mesajı aldığı zaman olduğundan eminim. Bu, sistem açıldığında olduğu gibi aynı şey değil, çekirdeğin başlatıldığı zamankiyle aynı şey değil.
bir CVn

Bildiğim kadarıyla systemd-analyze blameKernel init'ten önceki süreyi de içeriyor, en azından uefi'de.
Max Ried,

Tuptime ile net ve basit bir çıktı elde edersiniz.
Rfraile

1
@Rikr ilginç! Ancak bu komutu makinemde bulamıyorum. Bu github projesi mi?
fedorqui

@fedorqui Evet, github.com/rfrail3/tuptime adresinde veya Stretch veya
Sid'deki

Yanıtlar:


79

Sistemimde çalışma süresi şöyledir /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

Gönderen 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 dosya sistemi bir takım sahte dosya içerir. Bunlar gerçek dosyalar değil, sadece dosyalara benziyorlar, ancak doğrudan çekirdek tarafından sağlanan değerleri içeriyorlar. Her dosyayı okuduğunuzda /proc/uptime, içeriği anında yeniden oluşturulur. Proc dosya sistemi çekirdeğe bir arayüzdür.


Dosyanın linux çekirdek kaynak kodunda fs/proc/uptime.cde hat 49 , bir işlev çağrısı bkz:

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

Bu, (procfs genellikle altına monte edilmiştir ) adı verilen bir proc dosya sistemi girişi oluşturur ve bu sözde dosyadaki geçerli dosya işlemlerini ve bunlarla ilişkili işlevleri tanımlayan bir fonksiyonla ilişkilendirir. Çalışma süresi durumunda bu sadece ve operasyonlar. Eğer iz Ancak, işlevleri sona erecek geri burada çalışma süresi hesaplanır nerede.uptime/procread()open()


Dahili olarak, sistemlerin çalışma süresini periyodik olarak güncelleyen bir zamanlayıcı kesintisi vardır (diğer değerlerin yanı sıra). Zamanlayıcı-aralığın tıklandığı aralık, HZtam değeri çekirdek yapılandırma dosyasında tanımlanmış ve derleme zamanında uygulanan önişlemci makrosu tarafından tanımlanır .

Boşta kalma süresi ve CPU devri sayısı, frekansla HZ(saniye başına devir) birleştirilerek , son önyüklemeden bu yana (saniye cinsinden) hesaplanabilir.


Sorunuzu ele almak için: “Çalışma süresi” ne zaman saymaya başlar?

Çalışma süresi her döngüyü hızlandıran bir çekirdek iç değeri olduğundan, çekirdek başlatıldığında ne zaman saymaya başlar. Yani, ilk döngü sona erdiğinde. Herhangi bir şey monte edilmeden önce bile, doğrudan bootloader'dan hemen sonra çekirdek imajını kontrol eder.


2
+1, @chaos, zamanlayıcı kesme işleyicisi yüklendiğinde çalışma süresi sayacının başladığını söylemek daha doğru olur mu? Çekirdek bu işleyiciyi yapılandırıyor mu?
Prem,

3
@Prem Çekirdek başlatmanın bir parçası. Programlayıcı başlatılmasından hemen önce, zamanlayıcı kesmesi kaydedilecektir. Zamanlayıcı kodunun ilk yinelemesini çağıran zamanlayıcı kesmesidir (sadece bir işlev çağrısı ile). Eğer işe yargılanıyorsanız
chaos

Ancak bazen çekirdekten döndürülen uptime değeri her zaman aynı değildir. Anında hesaplandığı gibi, açılışta değil, sunucu bir süre senkronizasyonu kullanıyorsa veya ağır yük altındaysa, HZ'deki kaymalar nedeniyle bu değer değişebilir.
Rfraile

10

Bildiğim kadarıyla, sistemin çalışma süresini hesaplamak için uptimekullanır /proc/uptime. Uptime.c'nin kaynak kodunda daha net bir şekilde görebilirsiniz.

  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
Sözde dosyanın /proc/uptimeçalışma zamanından hesaplandığını söyleyebilirim .
Archemar

2
Bu doğru değil. Yukarıdaki linkteki kaynak koduna bir göz atın.
Inclooder

6

Standart bir UNIX sisteminde (orijinal kaynaklara göre *), en son yeniden başlatma giriş zamanını uptimeokur /var/adm/utmpxve kontrol eder.

Başka bir deyişle: bu aynı zamanda birlikte aldığınız tarihi alıyor who -bve o zamandan beri geçen zamanı hesaplıyor.

*) programa uptimebir bağlantıdır wve 1980 yılında BSD tarafından tanıtılmıştır.


Uhms, /var/adm/utmpxsistemimde bulamıyorum . Aslında, bile/var/adm
fedorqui

3
Böyle bir durumda ne tür bir işletim sistemi kullandığınızı belirtmelisiniz.
schily

Benim hatam! Ubuntu 14.04.
fedorqui,

Tamam, Solaris, AIX, HP-UX ve * BSD'de, orijinal wuygulamanın bu şekilde kullanıldığı yerlerde , ancak Linux genellikle biraz farklı şeyler yapıyor.
schily

4
Bence standart olarak geleneksel demek istiyorsun . Unix standardı, uptimenasıl gerçekleştirilmesi gerektiğine bağlı olarak , komutu belirtmez . AFAICT, OS / X’de / var / adm / utmpx yok. Bazı Linux tabanlı sistemler Unix uyumluluk sertifikası aldı.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.