🐝

macOS 15 (Sequoia)でcronからlaunchdに変更したメモ

2024/11/26に公開

はじめに

In English

This article is a note on replacing cron with launchd, which stopped working on macos15 (sequoia) written in Japanese.

crontabに以下のように記述して起動させて問題なく動いていたプログラムがMacOS15(Sequoia) にアップグレードしたら動かなくなった。

*/5 * * * * /Users/HanakoYamada/Local/battery.py

launchdで設定するとcronと同じように定期的に実行できるようになったのでメモしておく。

launchdの設定

~/Library/LaunchAgentsにplist(プロパティリスト)ファイルを置く方法と/Library/LaunchDaemonsに置く方法がある。

~/Library/LaunchAgents
ユーザがログインしている時に実行され、ログインユーザの環境で実行される。

/Library/LaunchDaemons
ユーザがログインしてなくてもバックグランドで実行される。全てのユーザに影響を与える。

今回は/Library/LaunchDaemonsにplistファイルを置くことにし、com.HanakoYamada.battery.plistの名前で以下のような内容のファイルを作成した。

com.HanakoYamada.battery.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
         "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>battery</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/HanakoYamada/Local/battery.py</string>
    </array>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Minute</key>
                <integer>0</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>5</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>10</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>15</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>20</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>25</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>30</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>35</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>40</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>45</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>50</integer>
        </dict>
        <dict>
            <key>Minute</key>
                <integer>55</integer>
        </dict>
    </array>

    <key>StandardErrorPath</key>
        <string>/Users/HanakoYamada/Library/Logs/battery_errors.log</string>
    <key>StandardOutPath</key>
        <string>/Users/HanakoYamada/Library/Logs/battery_errors.log</string>
  </dict>
</plist>

ファイルのオーナ、モードの変更

$ sudo chmod 644 /Library/LaunchDaemons/com.HanakoYamada.battery.plist
$ sudo chown root:wheel /Library/LaunchDaemons/com.HanakoYamada.battery.plist

構文チェック

構文チェックをしたらOKと出た。

$ plutil -lint /Library/LaunchDaemons/com.HanakoYamada.battery.plist
/Library/LaunchDaemons/com.HanakoYamada.battery.plist: OK

launcdに登録

次のコマンドを実行してlaunchdに登録する

$ sudo launchctl load /Library/LaunchDaemons/com.HanakoYamada.battery.plist 

このコマンドが上手くいかない場合、次のように実行する。

$ sudo launchctl bootstrap system /Library/LaunchDaemons/com.HanakoYamada.battery.plist

ログファイルの確認

plistファイルに以下のように記述したので、このログを確認する。

 <key>StandardErrorPath</key>
        <string>/Users/HanakoYamada/Library/Logs/battery_errors.log</string>
    <key>StandardOutPath</key>
        <string>/Users/HanakoYamada/Library/Logs/battery_errors.log</string>

ログファイルの内容表示

$ tail -f /Users/HanakoYamada/Library/Logs/battery_errors.log

Discussion