概要
cron も動かすことができますが launchd を素直に使いましょう
定義ファイルを XML (.plist
) で記載するので cron っぽくは記載できませんが同じようなことはできます
今回は Agents 方式の launchd を登録します
Agents の場合は対象のユーザがログインしているときのみ実行されます
環境
- macOS 10.14.2
.plist の作成
touch ~/Library/LaunchAgents/local.mac.testscript.plist
vim ~/Library/LaunchAgents/local.mac.testscript.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>local.mac.testscript</string>
<key>WorkingDirectory</key>
<string>/Users/username/work</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/docker-compose</string>
<string>up</string>
<string>-d</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<dict>
<key>Hour</key>
<integer>12</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</array>
<key>StandardOutPath</key>
<string>/var/log/system.log</string>
</dict>
</plist>
key
と string
や key
と array
の組み合わえて定義します
とりあえず基本的な設定項目 (Label
, WorkingDirectory
, ProgramArguments
, StartCalendarInterval
) を使っています
ProgramArguments
は実行するプログラムを指定しますポイントとしては実行するコマンドやスクリプトは必ずフルパスで実行しましょう
StartCalendarInterval
はカレンダー形式で実行時間を指定できる項目です
設定可能な時間形式はこちらが参考になります
launchd に登録する
launchctl コマンドがあるのでこれを使って登録や登録解除、手動実行などが行なえます
launchctl load ~/Library/LaunchAgents/local.mac.testscript.plist
これで登録できます
これだけでも指定の時間になれば実行できますがあらかじめ手動でテストしたい場合は start
を使います
launchctl start local.mac.testscript
デバッグ方法
実行結果のステータスやログは /var/log/system.log
にあります
デフォルトだとステータスコードくらいしか見ることができないので詳細なログを確認したい場合はログレベルを変更します
launchctl log level debug
また .pliist
を変更した場合は一度 unload
する必要があります
launchctl unload ~/Library/LaunchAgents/local.mac.testscript.plist
launchctl load ~/Library/LaunchAgents/local.mac.testscript.plist
launchctl start local.mac.testscript
Tips
LaunchControl という GUI で操作できるツールがあります
これを使えば cron の書式を使って定義することもできます
Homebrew でもインストールすることができます
brew cask install launchcontrol
最後に
Mac で launchd を使って定期実行させてみました
慣れれば cron のように使えると思います
Daemons 方式は今回紹介しませんでしたが Daemons を使えばログインしていない状態でも実行してくれます (anacron 的な感じかなと)
Daemons の場合は root 権限が必要になるのでご注意ください
0 件のコメント:
コメントを投稿