올해 랩톱에서 보낸 총 시간을 찾는 방법은 무엇입니까?


17

2016 년에 랩톱에서 작업하는 데 소요되는 총 시간을 알고 싶습니다.

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

이 형식으로 노트북의 총 가동 시간을 제공합니다.

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

이제 어떻게 추가합니까?


(1 + 06 : 41)의 의미를 말해 줄 수 있습니까?
kashish

@kashish 1 일, 6 시간 41 분
muru

문제는 wtmp로그 ( last명령 출력에 표시되는 )가 월 단위로 회전하도록 설정되어있어 /etc/logrotate.conf특정 기간이 지나면 가장 오래된 로그가 삭제된다는 의미입니다. 다시 말해, 당신이 무엇을하려고 last하더라도 정확하지 않을 것입니다
Sergiy Kolodyazhnyy

@ Serg wtmp에 대해 logrotate를 비활성화했습니다. 그렇게 한 지 1 년이 지났으며 파일 크기는 현재 3.7M입니다. 그래서 매월 교체 해야하는 이유는 없습니다. ;)
daltonfury42

비활성화되어 있으면 회전하지 않습니다. 대부분의 사용자는 그렇게하지 않습니다.
Sergiy Kolodyazhnyy

답변:


5

awk + awk 버전은 다음과 같습니다.

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
        }'

last마지막 열은 형식 (<days>+hours:minutes)이며 days+, 기간이 1 일 미만이면 삭제됩니다.

여기에서 첫 번째 awk명령은 reboot항목 에 대한 마지막 열인 관심 기간을 출력 합니다.

두 번째 awk명령의 경우 :

  1. FS이다 [(+:)], 즉, 괄호 또는 + : . 그래서, (h:m)에 분할 , h, m(첫 번째와 마지막 필드 비어 있음), 그리고 (d+h:m)분열이다 , d, h, m(다시, 첫 번째와 마지막 필드가 비어).
  2. 그런 다음 두 번째 마지막 필드를 몇 분 동안, 세 번째 마지막 시간을 몇 시간 동안, 네 번째 마지막 필드를 며칠 동안 가져갑니다. 네 번째 마지막 필드는 일이없는 경우 비어있는 첫 번째 필드입니다. 0이 경우 간단히 추가하겠습니다 .
  3. 그런 다음 분과 시간이 각각 60과 24를 초과하면 시간과 일을 늘립니다. 그 AWK 그래서, 포인트 부문 부동 않습니다 hd분수 부분을 이제있을 수 있습니다.
  4. 그런 다음 숫자를 정수 ( %d) 로 인쇄 하므로 소수 부분은 무시됩니다.

8

bash 스크립트로 시도하고 명령을 확장하십시오. dateutils시간을 더하는 데 사용 합니다.

따라서이 스크립트를 사용하려면를 dateutils통해 사용할 수 있는 패키지가 필요합니다 apt. ( sudo apt install dateutils)

이 스크립트는 현재 가동 시간 (현재 세션)도 고려하므로보다 정확합니다. 초는 계산되지 않습니다. 보고 된 최저 단위는 분입니다.

#!/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"
  • 마지막으로 다시 부팅 한 가동 시간이 먼저 나열되어 날짜, 시간, 분 및 초 정보를 추출하도록 형식이 지정됩니다. 그런 다음에 저장됩니다 temp.
  • 참조 가짜 날짜는 2015-01-01현재 가동 시간이 추가되는 org =라고 설정 됩니다.
  • 그런 다음 모든 누적 가동 시간이 변수에 추가됩니다. new
  • org순 가동 시간과 지속 시간 간의 new차이는 차이에 의해 확인됩니다.

산출:

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

다음 스크립트는 스크립트가 실행 된 날로부터 정확히 1 년 동안 가동됩니다 .

#!/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
어쨌든 나는 bash 스크립트를 좋아하지만 더 우아한 답변이 가능하다는 것을 알고 있습니다.
ankit7540

당신의 대본에 따르면, 나는 작년에 온라인에서 2258 일, 01 시간, 15 분을 보냅니다.
daltonfury42

오류가 수정되었습니다. 8 줄로 압축 된 코드.
ankit7540

5

다음은 내가 원하는 것을 파이썬으로 구현 한 것이지만 bash로 우아한 방법이 있다고 확신합니다.

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
"나는 확실히 떠들썩한 파티와 함께 할 수있는 우아한 방법이 있어요" 이럴 파이썬은 더 나은 선택이 될 것입니다. Bash는 계산이 아닌 파일 조작에 좋습니다.
Melebius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.