Created
July 7, 2022 02:56
-
-
Save biji/2fbf42ac8440f088aca9c0cfd2f6ae05 to your computer and use it in GitHub Desktop.
Calculate suspend time from systemd's journalctl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# NAME: suspendtime | |
# PATH: $HOME/askubuntu/ | |
# DESC: For: https://askubuntu.com/questions/321855/how-to-get-real-uptime | |
# DATE: November 6, 2019. | |
# NOTE: Calculate suspend time from systemd's journalctl | |
# UPDT: | |
# 2022-07-07 modified regex | |
# 2019-11-07 Fine-tune removing 0 Units in DaysMinutesStr | |
# 2020-05-09 Add "weeks" unit measure to DaysMinutes() function | |
# Duplicate DaysMinutes from ~/.bashrc for Ask Ubuntu | |
DaysMinutes () { | |
local w d h m s | |
(( w = ${1} / 604800 )) | |
(( d = ${1}%604800 / 86400 )) | |
(( h = (${1}%86400) / 3600 )) | |
(( m = (${1}%3600) / 60 )) | |
(( s = ${1}%60 )) | |
DaysMinutesStr="$w weeks, $d days, $h hours, $m minutes, $s seconds" | |
# Convert 1's to singular | |
[[ ${DaysMinutesStr:0:2} = "1 " ]] && \ | |
DaysMinutesStr="${DaysMinutesStr/weeks/week}" | |
DaysMinutesStr="${DaysMinutesStr/ 1 days/ 1 day}" | |
DaysMinutesStr="${DaysMinutesStr/ 1 hours/ 1 hour}" | |
DaysMinutesStr="${DaysMinutesStr/ 1 minutes/ 1 minute}" | |
DaysMinutesStr="${DaysMinutesStr/ 1 seconds/ 1 second}" | |
# Suppress zero strings | |
[[ ${DaysMinutesStr:0:1} = "0" ]] && | |
DaysMinutesStr="${DaysMinutesStr/0 weeks, / }" | |
DaysMinutesStr="${DaysMinutesStr/ 0 days, / }" | |
DaysMinutesStr="${DaysMinutesStr/ 0 hours, / }" | |
DaysMinutesStr="${DaysMinutesStr/ 0 minutes, / }" | |
DaysMinutesStr="${DaysMinutesStr/, 0 seconds/}" | |
} # DaysMinutes | |
# Build array of suspend cycles from Systemd | |
IFS=$'\n' Arr=( $(journalctl -b-0 | \ | |
grep -E 'systemd\[1]: (Starting|Finished).*Suspend' | cut -c1-15) ) | |
[[ ${#Arr[@]} -gt 0 ]] && upper=$(( ${#Arr[@]} - 1 )) | |
[[ $upper -gt 0 ]] && for (( i=0; i<upper; i=i+2 )) ; do | |
(( SuspendCount++ )) | |
Time=$(( $(date +%s -d "${Arr[i+1]}") - $(date +%s -d "${Arr[i]}") )) | |
SuspendTime=$(( SuspendTime + Time )) | |
DaysMinutes "$Time" | |
printf "%s to %s suspended%s\n" "${Arr[i]}" "${Arr[i+1]}" \ | |
"$DaysMinutesStr" | |
done | |
echo | |
LinuxTime=$(( $(date +%s -d "Now") - $(date +%s -d "$(uptime -s)") )) | |
DaysMinutes "$LinuxTime" | |
printf "Linux uptime %'d seconds (%s)\n" "$LinuxTime" "$DaysMinutesStr" | |
[[ "$SuspendTime" -ne '' ]] && ( | |
DaysMinutes "$SuspendTime" | |
printf "%s Suspends %'d seconds (%s)\n" \ | |
"$SuspendCount" "$SuspendTime" "$DaysMinutesStr" | |
) | |
RealTime=$(( LinuxTime - SuspendTime )) | |
DaysMinutes "$RealTime" | |
printf "Real uptime %'d seconds (%s)\n" "$RealTime" "$DaysMinutesStr" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment