Skip to content

Instantly share code, notes, and snippets.

@dreness
Last active January 26, 2024 01:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dreness/a3cc628b83aac6618fecaaa4d0f1e9e9 to your computer and use it in GitHub Desktop.
Save dreness/a3cc628b83aac6618fecaaa4d0f1e9e9 to your computer and use it in GitHub Desktop.
Reconstitute the "wake requests" data from `pmset -g log` into a more digestible form
#!python3
import re
import fileinput
import sys
import csv
# 2022-10-31 01:57:27 -0700 Wake Requests [*process=mDNSResponder request=Maintenance deltaSecs=7198 wakeAt=2022-10-31 03:57:25 info="upkeep wake"] [process=powerd request=TCPKATurnOff deltaSecs=316637 wakeAt=2022-11-03 17:54:44] [process=powerd request=UserWake deltaSecs=7850 wakeAt=2022-10-31 04:08:17 info="com.apple.alarm.user-visible-com.apple.CalendarNotification.EKTravelEngine.periodicRefreshTimer,14054"]
# 2024-01-18 18:18:15 -0800 Wake Requests [process=mDNSResponder request=Maintenance deltaSecs=2648 wakeAt=2024-01-18 19:02:23 info="DHCP lease renewal"] [*process=dasd request=SleepService deltaSecs=950 wakeAt=2024-01-18 18:34:05 info="com.apple.dasd:501:com.apple.proactive.ProactiveHarvesting.Harvest.DelayedBudgeted"] [process=powerd request=TCPKATurnOff deltaSecs=316858 wakeAt=2024-01-22 10:19:13] [process=powerd request=CSPNEvaluation deltaSecs=7253 wakeAt=2024-01-18 20:19:08] [process=powerd request=UserWake deltaSecs=8999 wakeAt=2024-01-18 20:48:15 info="com.apple.alarm.user-invisible-com.apple.acmd.alarm,294"]
# match a Wake Requests line; grab the time stamp and the wake reasons
WakeRequests = re.compile(r"^(.*?)\sWake\sRequests\s+(.*)$")
# match a single wake reason, which has a handful of k/v pairs
WakeRequest = re.compile(r"\[(.*?)\]")
# match a single wake reason and extract the k/v pairs
# note that some of the string values contain spaces and aren't quoted, so we can't
# split on =
kvs = re.compile(r"""
\*?process=(?P<process>.*?)
\s
request=(?P<request>.*?)
\s
deltaSecs=(?P<deltaSecs>\d+)
\s
wakeAt=(?P<wakeAt>\S*\s\S*)
(\sinfo=(?P<info>.*))? # <-- optional!
""",
re.VERBOSE)
def process(line):
m1 = re.match(WakeRequests, line)
# if there is insufficient group match, skip to the next line
if not m1 or len(m1.groups()) < 2:
return
log_time = m1.group(1)
wrequests = m1.group(2)
# [process=mDNSResponder request=Maintenance deltaSecs=7198 wakeAt=2022-11-06 09:05:21 info=upkeep wake] [process=powerd request=TCPKATurnOff deltaSecs=294258 wakeAt=2022-11-09 16:49:41] [*process=powerd request=UserWake deltaSecs=2905 wakeAt=2022-11-06 07:53:48 info=com.apple.alarm.user-visible-Weekly Usage Report,71182]
# [process=mDNSResponder request=Maintenance deltaSecs=2516 wakeAt=2024-01-18 19:02:38 info="DHCP lease renewal"] [*process=dasd request=SleepService deltaSecs=1045 wakeAt=2024-01-18 18:38:07 info="com.apple.dasd:501:com.apple.chronod.nextScheduledTimelineRefresh"] [process=powerd request=TCPKATurnOff deltaSecs=316712 wakeAt=2024-01-22 10:19:13] [process=powerd request=CSPNEvaluation deltaSecs=7107 wakeAt=2024-01-18 20:19:08] [process=powerd request=UserWake deltaSecs=8853 wakeAt=2024-01-18 20:48:15 info="com.apple.alarm.user-invisible-com.apple.acmd.alarm,294"]
m2 = re.findall(WakeRequest, wrequests)
for r in m2:
#print(f"r in m2: {r}")
m3 = re.match(kvs, r)
#print(f"m3: {m3}")
logLine = [
log_time,
m3.group('info') or '',
m3.group('process'),
m3.group('request'),
m3.group('deltaSecs'),
m3.group('wakeAt') or ''
]
# replace any commas with spaces
logLine = [s.replace(',', ' ') for s in logLine]
# print(logLine)
csvOut.writerow(logLine)
f = open('wake_reasons.csv', 'w+')
csvOut = csv.writer(f, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
csvOut.writerow(['logTime', 'info', 'process', 'request', 'deltaSecs', 'wakeAt'])
for line in fileinput.input(encoding="utf-8"):
process(line)
f.close()
@dreness
Copy link
Author

dreness commented Nov 6, 2022

pmset -g log | grep 'Wake Requests' | python wake_requests.py

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment