Bu yıl dizüstü bilgisayarımda geçirdiğim toplam süreyi nasıl bulabilirim?


17

2016 yılında dizüstü bilgisayarımda çalışmak için harcadığım toplam zamanı bilmek istiyorum.

last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-'

dizüstü bilgisayarın toplam çalışma süresini şu biçimde verir:

(01:33) 
(04:40) 
(01:31) 
(1+06:41) 
(02:47) 
(00:30)

Şimdi nasıl ekleyebilirim?


(1 + 06: 41) 'in anlamını söyleyebilir misin?
kashish

@kashish 1 gün, 6 saat, 41 dakika
muru

Mesele şu ki, wtmpgünlükler ( lastkomutun çıktısında gördüğünüz şey ) aylık olarak (in /etc/logrotate.conf) dönecek şekilde ayarlanmıştır , yani belirli bir süre sonra en eski günlük silinir. Başka bir deyişle, ne yapmaya çalışırsanız last
Sergiy Kolodyazhnyy

@ Wtmp için logrotate'i devre dışı bıraktım. Bunu yaptığımdan beri bir yıldan fazla oldu ve dosya boyutu şu anda 3.7M. Bu yüzden aylık olarak döndürülmesi için bir neden göremiyorum. ;)
daltonfury42

@ daltonfury42 Devre dışı bırakılırsa dönmez. Çoğu kullanıcı bunu yapmaz.
Sergiy Kolodyazhnyy

Yanıtlar:


5

İşte bir awk + awk sürümü:

last ... | awk '/reboot/{print $NF}' |
    awk -F '[(+:)]' '
        {
            d += $(NF - 3); h += $(NF - 2); m += $(NF - 1)
        }
        END {
            carry = m / 60; h += carry;
            carry = h / 24; d += carry;
            printf "%d days, %d hours, %d minutes\n", d, h % 24, m % 60
        }'

lastbireyin Son sütun biçiminde olduğu (<days>+hours:minutes), days+dönem 1 günden az ise düşürülür.

Burada, ilk awkkomut girişler için son sütunu, ilgi süresini verir reboot.

İkinci awkkomut için:

  1. FSolan [(+:)], diğer bir deyişle parantez veya + ya : . Yani, (h:m)hiç bölünmüş olup , h, mve (ilk ve son alanları boş) ve (d+h:m)karşı bölünmüş olan , d, h, mve (yine ilk ve son alanlarını boşaltın).
  2. Sonra dakikalar için ikinci son alanı, saatler için üçüncü son ve günler için dördüncü son alanı alırız. Günler yoksa dördüncü son alan ilk, boş alan olacaktır. Yani, 0bu durumda basitçe ekleyeceğiz .
  3. Ardından dakikalar ve saatler sırasıyla 60 ve 24'ün üzerindeyse saat ve günleri artırırız. Awk'nin kayan nokta bölümü yaptığını hve dşimdi kesirli kısımlara sahip olabileceğini unutmayın.
  4. Sonra sayıları tamsayı ( %d) olarak yazdırırız , böylece kesirli kısımlar yok sayılır.

8

Bh komut dosyası ile denemek ve komutunuzu genişletmek. dateutilsSüreyi eklemek için kullanıyorum .

Bu nedenle bu komut dosyasını kullanmak için dateutilsmevcut pakete ihtiyaç vardır apt. ( sudo apt install dateutils)

Bu komut dosyası geçerli çalışma süresini de (şimdiki oturum) dikkate alır, dolayısıyla daha doğru olur. Saniye sayılmaz. Bildirilen en düşük birim dakikadır.

#!/bin/bash
# Total uptime reported.
temp=$(last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60)'  )
echo "Total run time (days:hours:minutes)"
curr="2015-01-01T"$curr
org="2015-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"
  • Önce gün, saat, dakika ve ikinci bilgileri ayıklamak için son yeniden başlatmanın çalışma süreleri listelenir ve biçimlendirilir. Bu daha sonra içine kaydedilir temp.
  • 2015-01-01Geçerli çalışma süresinin eklendiği org = adı verilen bir referans sahte tarih ayarlanır .
  • Sonra tüm birikimli çalışma süreleri değişkene eklenir new
  • orgNet çalışma süresi newile net çalışma süresi arasındaki fark farkla bulunur.

Çıktı:

vayu@helix:$ ./uptime_record.sh
Total run time (days:hours:minutes)
57d 20h 36m

Aşağıdaki komut dosyası, komut dosyasının çalıştırıldığı günden itibaren tam bir yıl içinde çalışma süresi içindir .

#!/bin/bash
# Total uptime reported since exactly 1 year (from the time script is run).
now="$(date +'%Y-%m-%d')" ;
last_y=$(dateutils.dadd $now -1y)
temp=$(last reboot --since "$last_y" --until "$now" | grep -o '(.*)' | grep  -v '-' | sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g ;s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g'  )
curr=$( cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60)'  )
echo "Total run time in one year (days:hours:minutes)"
curr="1980-01-01T"$curr
org="1980-01-01T00:00:00"
new=$(dateutils.dadd $curr $temp )
dateutils.ddiff $org $new -f "%dd %Hh %Mm"

1
Her nasılsa bash senaryolarını seviyorum, ama burada daha zarif cevapların mümkün olduğunu biliyorum.
ankit7540

Senaryonuza göre geçen yıl 2258 gün, 01 saat, 15 dakika çevrimiçi geçiriyorum.
daltonfury42

Hata düzeltildi. Kod 8 satıra sıkıştırılmıştır.
ankit7540

5

İşte ne istediğimi bir python uygulaması, ama eminim bash ile yapmak için zarif bir yol var:

import subprocess
output = subprocess.run("last reboot --since 2016-01-01 --until 2016-12-31 | grep -o '(.*)' | grep  -v '-'| sed -e 's/(//g; s/)//g; s/+/:/g'", shell=True, stdout=subprocess.PIPE, universal_newlines=True)
mins_total = 0

for line in output.stdout.split('\n')[:-1]:
    try:
        (hrs, mins) = [int(k) for k in line.split(':')]
        days = 0
    except:
        (days, hrs, mins) = [int(k) for k in line.split(':')]
    mins_total += (days*24 + hrs)*60 + mins

print("Hours: " + str(mins_total/60))
print("Days: " + str(mins_total/60/24))

3
“Eminim bash ile yapmanın zarif bir yolu var” IMHO Python daha iyi bir seçim. Bash, hesaplamalar için değil, dosya manipülasyonları için iyidir.
Melebius
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.