記事「macOSでn分ごとに通知する」のサムネイル

macOSでn分ごとに通知する

公開日:
更新日:

はじめに

macOSで、スリープが解除されてからn分ごとに通知を表示する方法をまとめておきます。

システム構成

今回のシステム構成は以下の通りです。

  1. SleepWatcherを使ってスリープ解除を検知し、Pythonスクリプトを実行する
  2. Pythonスクリプトにて、n分ごとにAppleScriptを実行し、通知を表示する

手順

Python スクリプトを書く

whileループとsleepを使って、一定間隔でAppleScript(osascript)を実行します。
以下は20分ごとに通知を表示する例で、sleep_minutes = 20 の部分を変更すれば、任意の分数に変更できます。

import time
import subprocess
import signal
import sys
from types import FrameType
from typing import Optional

def notify(title: str, message: str):
    subprocess.run(
        [
            "osascript",
            "-e",
            f'display notification "{message}" with title "{title}" sound name "Ping"',
        ]
    )


def handle_sigterm(_signum: int, _frame: Optional[FrameType]):
    # 必要ならここでログや後始末
    sys.exit(0)


def main():
    # notify("20-20-20ルールスタート", "スタートです。")
    signal.signal(signal.SIGTERM, handle_sigterm)

    sleep_minutes = 20
    MINUTE_SEC = 60
    while True:
        time.sleep(sleep_minutes * MINUTE_SEC)
        notify("20-20-20ルール", "20秒間、6m先を見ましょう!")


if __name__ == "__main__":
    main()

SleepWatcherの設定

SleepWatcherの設定ファイルを作成します。

まず、スリープ解除時の処理として、Pythonスクリプトを起動するコマンドを書きます。
~/.wakeupにPythonスクリプトを起動するコマンドを記述します。

念のため、既に起動している同じスクリプトを終了させてから、新たに起動するようにしています。

~/.wakeup
#!/bin/zsh

CMD=(/opt/homebrew/bin/uv run /Users/riku/Private/Languages/Python/notify202020/main.py)
pkill -f $CMD 2>/dev/null
nohup $CMD >/tmp/20rule.log 2>&1 &

この例ではuvを使ってPythonスクリプトを実行しているが、python3pythonコマンドを使っても問題ありません。
その場合はCMDが以下のようになります。

python3 /path/to/your/script.py

次に、スリープ時にPythonスクリプトを終了させるコマンドを書きます。
~/.sleepにファイルを作成します。

~/.sleep
#!/bin/zsh

CMD=(/opt/homebrew/bin/uv run /Users/riku/Private/Languages/Python/notify202020/main.py)
pkill -f $CMD 2> /dev/null

SleepWatcherのインストール

Homebrewでインストールできます。

brew install sleepwatcher

SleepWatcherの起動設定

Homebrewのサービスとして起動します。

brew services start sleepwatcher

おわりに

この方法を使って、定期的に休憩を促す通知を表示できます。休憩の目安として使ってみるといいかもしれません。

参考

sleepwatcherを用いてmacOSのスリープ/復帰時に任意のスクリプトを実行する
sleepwatcherを用いてmacOSのスリープ/復帰時に任意のスクリプトを実行する favicon zenn.dev
sleepwatcherを用いてmacOSのスリープ/復帰時に任意のスクリプトを実行する
Mac Automation Scripting Guide: Displaying Notifications
New document.
Mac Automation Scripting Guide: Displaying Notifications favicon developer.apple.com