내 컴퓨터가 하루에 실행될 수 있는 시간에 대한 일일 제한을 설정하고 싶습니다. 이를 위해 특정 마일스톤에 도달했을 때 적절한 조치를 취하는 cron 스크립트를 작성하고 있습니다(시간이 초과되면 경고 표시, 시간이 초과되면 컴퓨터 종료).
제가 고민하고 있는 부분은 하루 동안의 총 가동 시간을 분 단위로 얻는 것입니다. 나는 본 적이이 가동 시간 스크립트, 하지만 제 생각에는마지막제일 쉬운.
$ last -s today
나에게 다음과 같은 것을 주었다:
user tty1 Sat Jul 22 14:09 still logged in
user tty1 Sat Jul 22 11:50 - down (01:56)
현재 괄호 안의 시간을 분으로 변환하고 "아직 로그인 상태" 세션을 분으로 변환하려고 합니다. 작동하지만 이 모든 옵션이 약간 복잡하다고 생각됩니다.
분 단위로 총 가동 시간(일시 중지/절전 제외)을 얻는 더 쉬운 방법이 있습니까? 아니면 이러한 유형의 출력에 대한 해결 방법을 찾아야 합니까?
답변1
uptime
현재 세션의 총 시간(분)을 얻으려면 셸에서 다음 명령을 실행하십시오 .
echo "Total uptime today (minutes): $(( ($(date +%s) - $(date -d "$(uptime -s)" +%s)) / 60 ))"
awk
다음을 사용하고 수행하십시오 /proc/uptime
.
awk '{print "Total uptime for the machine (minutes):", int($1 / 60)}' /proc/uptime
고쳐 쓰다:
처음 두 명령은 현재 세션의 실행 시간만 표시합니다.
이제 작은 bash 스크립트로 구현했으며, 셸에서 한 줄의 코드를 통해 이를 수행할 수도 있습니다 last
./proc/uptime.
#!/bin/bash
sessions_uptime=$(last | grep "$(date '+%b %d')" | grep 'reboot' | grep -v 'still running' | awk '{print $NF}' | tr -d '()' | awk -F: '{sum_minutes+=$1*60+$2} END {print sum_minutes}')
current_time=$(awk '{print int($1 / 60)}' /proc/uptime)
total_uptime=$((sessions_uptime + current_time))
echo "TOTAL CURRENT RUNTIME OF THE DAY: ${total_uptime}"
sessions_uptime
- 을 제외한
reboots
모든 항목을 필터링하고 해당 날짜의 모든 세션에 대한 시간을 분 단위로 계산합니다.last
still running
current_time
- 세션의 현재 실행 시간을 계산합니다.
total_uptime
- 현재 세션을 포함하여 해당 날짜의 총 가동 시간인 두 값의 합을 출력합니다. 나는 이것을 Debian 11.7에서 구현했습니다. 이것이 모든 시스템에서 작동하는지 말할 수는 없습니다.
업데이트 2:
#!/bin/bash
get_minutes() {
local h=${1%%:*}
local m=${1#*:}
echo $((10#$h * 60 + 10#$m))
}
sessions_uptime=$(last | grep "$(date '+%b %d')" | grep -E 'reboot|suspended' | grep -v 'still running' | awk '{print $NF}' | tr -d '()' | awk -F: '{sum_minutes+=$1*60+$2} END {print sum_minutes}')
current_uptime_seconds=$(awk '{print int($1)}' /proc/uptime)
total_uptime=$((sessions_uptime + current_uptime_seconds / 60))
echo "TOTAL CURRENT RUNTIME OF THE DAY: ${total_uptime} minutes"
고려해야 할 가능한 시나리오를 결정하고 접근 방식이 적절한 경우 스크립트를 조정합니다.
인터넷에서 이러한 상태 메시지를 찾았 last
지만 모두 정확한지는 확인할 수 없습니다.
"재시작"
시스템이 정상적으로 다시 시작되었습니다
"폐쇄"
시스템이 정상적으로 종료되었습니다.
"정지시키다"
시스템이 일시 중지 또는 최대 절전 모드로 전환되었습니다.
"다시 덮다"
시스템이 일시 중지 또는 최대 절전 모드에서 다시 시작되었습니다.
"충돌"
오류 또는 충돌로 인해 시스템이 다시 시작됩니다.
"아래에"
시스템이 다운되었습니다. 이는 정전이나 하드웨어 문제로 인해 발생할 수도 있습니다.
"사라짐 - 로그아웃 없음"
사용자가 제대로 로그아웃하지 않고 갑자기 연결을 종료한 경우 표시될 수 있습니다.