macOSでn分ごとに通知する
公開日:
更新日:
はじめに
macOSで、スリープが解除されてからn分ごとに通知を表示する方法をまとめておきます。
システム構成
今回のシステム構成は以下の通りです。
- SleepWatcherを使ってスリープ解除を検知し、Pythonスクリプトを実行する
- 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スクリプトを実行しているが、python3やpythonコマンドを使っても問題ありません。
その場合は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/nullSleepWatcherのインストール
Homebrewでインストールできます。
brew install sleepwatcherSleepWatcherの起動設定
Homebrewのサービスとして起動します。
brew services start sleepwatcherおわりに
この方法を使って、定期的に休憩を促す通知を表示できます。休憩の目安として使ってみるといいかもしれません。
参考
sleepwatcherを用いてmacOSのスリープ/復帰時に任意のスクリプトを実行する
Mac Automation Scripting Guide: Displaying Notifications
New document.
