2019年2月8日金曜日

macOS で cron 的なことをするのは launchd を使う

概要

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>

keystringkeyarray の組み合わえて定義します
とりあえず基本的な設定項目 (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 件のコメント:

コメントを投稿