自動ラン系(launchd)を設定する場合
REINS自動ラン(毎日9:30)・ITANDI受信箱監視(1日3回)・ITANDI新着ボットの3種は、macOSのlaunchdという仕組みで自動実行している。~/Library/LaunchAgents/に以下の3つのplistファイルを作成し、launchctl loadする。
⚠⚠ 最重要の注意 ⚠⚠
自動ランを動かすのは常に1台だけにすること。既存のMacで稼働中のまま、新しいMacでもlaunchctl loadしてしまうと、同じ処理が二重に実行され、二重通知・二重ログイン試行などの不具合につながる。新しいMacに移行する場合は、既存Mac側でlaunchctl bootout gui/$(id -u)/com.incerto.bukken-check-reinsのように停止してから、新しいMac側でloadすること。
7-1. auto_reins.sh / auto_inbox.sh 内のPython3パスを確認する
auto_reins.sh・auto_inbox.shはPYTHON_BIN変数にPython3の絶対パスを直接書いている。新しいMacでのパスを確認し、違っていれば書き換える。
which python3
表示されたパスが、auto_reins.sh・auto_inbox.sh冒頭のPYTHON_BIN=の値と違う場合は、その行を書き換える。同様に、下記com.incerto.itandi-new.plistのProgramArguments1行目のPython3パスも合わせて書き換える。
これらのスクリプトは失敗時に/Users/自分のユーザー名/bin/notify.sh(Discord通知用の個人スクリプト。bukken-checkリポジトリの外にある別ツール)を呼び出す。新しいMacで通知も動かしたい場合は、そのスクリプトも別途用意する必要がある(無くてもcheck.py/inbox.py本体の動作には影響しない)。
7-2. com.incerto.bukken-check-reins.plist(REINS自動ラン・毎日9:30)
cat > ~/Library/LaunchAgents/com.incerto.bukken-check-reins.plist << 'EOF'
<?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>com.incerto.bukken-check-reins</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/自分のユーザー名/bukken-check/auto_reins.sh</string>
</array>
<key>StandardErrorPath</key>
<string>/Users/自分のユーザー名/bukken-check/logs/launchd-reins.log</string>
<key>StandardOutPath</key>
<string>/Users/自分のユーザー名/bukken-check/logs/launchd-reins.log</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>30</integer>
</dict>
</dict>
</plist>
EOF
上記の/Users/自分のユーザー名/の部分は、実際のホームフォルダのパス(echo ~で確認できる)に置き換えること。
7-3. com.incerto.bukken-check-inbox.plist(ITANDI受信箱監視・1日3回)
cat > ~/Library/LaunchAgents/com.incerto.bukken-check-inbox.plist << 'EOF'
<?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>com.incerto.bukken-check-inbox</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/自分のユーザー名/bukken-check/auto_inbox.sh</string>
</array>
<key>StandardErrorPath</key>
<string>/Users/自分のユーザー名/bukken-check/logs/launchd-inbox.log</string>
<key>StandardOutPath</key>
<string>/Users/自分のユーザー名/bukken-check/logs/launchd-inbox.log</string>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>8</integer>
<key>Minute</key>
<integer>40</integer>
</dict>
<dict>
<key>Hour</key>
<integer>13</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<dict>
<key>Hour</key>
<integer>17</integer>
<key>Minute</key>
<integer>30</integer>
</dict>
</array>
</dict>
</plist>
EOF
7-4. com.incerto.itandi-new.plist(ITANDI新着ボット)
cat > ~/Library/LaunchAgents/com.incerto.itandi-new.plist << 'EOF'
<?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>com.incerto.itandi-new</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python3</string>
<string>/Users/自分のユーザー名/bukken-check/itandi_new.py</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/自分のユーザー名/bukken-check</string>
<key>StandardErrorPath</key>
<string>/Users/自分のユーザー名/bukken-check/logs/launchd-itandi-new.log</string>
<key>StandardOutPath</key>
<string>/Users/自分のユーザー名/bukken-check/logs/launchd-itandi-new.log</string>
<key>StartInterval</key>
<integer>900</integer>
</dict>
</plist>
EOF
このProgramArguments1行目のPython3パスも、7-1で確認した実際のパスに書き換えること(/usr/bin/python3はあくまで仮の値)。ITANDI_NEW_CONDITION_NAME・NOTIFY_WEBHOOK_ITANDI_NEW等の関連設定は.env側(STEP 4)に入れる。
7-5. loadする
launchctl load ~/Library/LaunchAgents/com.incerto.bukken-check-reins.plist
launchctl load ~/Library/LaunchAgents/com.incerto.bukken-check-inbox.plist
launchctl load ~/Library/LaunchAgents/com.incerto.itandi-new.plist
エラーが出なければ登録完了。動作確認はlaunchctl kickstart -k gui/$(id -u)/com.incerto.bukken-check-reinsのように該当のLabelを指定して即時実行し、logs/フォルダ内のログファイルを確認する。