Skip to content

Instantly share code, notes, and snippets.

@biji
Created July 7, 2022 02:56
Show Gist options
  • Save biji/2fbf42ac8440f088aca9c0cfd2f6ae05 to your computer and use it in GitHub Desktop.
Save biji/2fbf42ac8440f088aca9c0cfd2f6ae05 to your computer and use it in GitHub Desktop.
Calculate suspend time from systemd's journalctl
#!/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