M1 Macで毎日決まった時間に動かしたいスクレイピング処理があり、Lauchdを利用してPythonプログラムを実行させるようにしました。しかし、Macがその時間にスリープしていると処理が正常に完了しないケースがあり困っていました。
まず、Launchdはマシンがスリープしていると動作しません。スリープ中に実行時間が過ぎた場合はスリープから復帰した際に直ちに実行されるという仕様になっています。
しかし、スリープ中でも中途半端に処理が実行されているケースがありました。
実はMacのスリープが実は定期的に解除されていたのです。Macのスリープが意図せず解除されているケースは多いようでインターネット上には報告、解説の記事が多いので詳細は割愛します。今回のケースはUSB機器や無線Wi-Fiが原因 と思われます。
定期的にスリープ復帰があり、そのタイミングでLaunchdが起動するのであれば、定期実行したいという意図に合うので良いのではないかと思いますが、実際にはそのようにうまく行きません。
Launchdが実行されるタイミングの直前電源状態のログを[sudo pmset -g log]コマンドで確認しました。
2021-10-09 11:00:11 +0900 Sleep Entering Sleep state due to 'Sleep Service Back to Sleep':TCPKeepAlive=active Using Batt (Charge:83%) 980 secs
2021-10-09 11:00:12 +0900 Wake Requests [*process=dasd request=SleepService deltaSecs=979 wakeAt=2021-10-09 11:16:31 info="com.apple.dasd:0:com.apple.poweruiagent.reportAnalyticsRepeating"] [process=mDNSResponder request=Maintenance deltaSecs=7200 wakeAt=2021-10-09 13:00:12 info="upkeep wake"] [process=powerd request=TCPKATurnOff deltaSecs=187802 wakeAt=2021-10-11 15:10:14] [process=powerd request=UserWake deltaSecs=69412 wakeAt=2021-10-10 06:17:04 info="com.apple.alarm.user-visible-Weekly Usage Report,976"]
2021-10-09 11:00:12 +0900 PM Client Acks Delays to Sleep notifications: [mDNSResponder is slow(731 ms)]
2021-10-09 11:16:31 +0900 Assertions PID 648(mDNSResponder) Created MaintenanceWake "mDNSResponder:maintenance" 00:00:00 id:0x0xd00009499 [System: PrevIdle]
2021-10-09 11:16:31 +0900 Assertions PID 648(mDNSResponder) Released MaintenanceWake "mDNSResponder:maintenance" 00:00:00 id:0x0xd00009499 [System: PrevIdle]
2021-10-09 11:16:31 +0900 com.apple.sleepservices.sessionStarted SleepService: window begins with cap time=180 secs
2021-10-09 11:16:31 +0900 DarkWake DarkWake from Deep Idle [CDNP] : due to NUB.SPMI0Sw3IRQ nub-spmi.0x02 rtc/SleepService Using BATT (Charge:83%) 4 secs
2021-10-09 11:16:31 +0900 WakeDetails DriverReason:NUB.SPMI0Sw3IRQ - DriverDetails:
DriverReason:nub-spmi.0x02 - DriverDetails:
DriverReason:rtc - DriverDetails:
2021-10-09 11:16:31 +0900 HibernateStats hibmode=3 standbydelaylow=0 standbydelayhigh=0 8447
2021-10-09 11:16:31 +0900 WakeTime WakeTime: 0.224 sec
スリープ復帰後、Launchdで少しだけ処理が始まったのち、またMacがスリープしてしまい処理が中断されてしまうという事態になっておりました。
今回定期実行していた処理はSeleniumを利用したスクレイピング処理だったので、そのように処理が細切れで実行されることで途中でエラーが起こってしまっていました。
結局、Launchdで安定して定期実行させるためには、その時間にMacを起動させておかなければいけないということのようです。
コメント