それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

LaunchAgent に登録して、スクリプトを自動起動する

OS X の Launch Agents で自動起動する

OSX では launchctl を導入されている。すべてのプロセスはここから始まる。

Launch agent でできる事

launchctl コマンドを使えば、自動起動するスクリプトを作ることが出来る。

どんな時にもイベントで起動するのでちょっと便利

  • StartOnMount : デバイスがマウントされた時
  • WatchPaths: ファイルの変更を監視する
  • RunAtLoad : ログイン時に起動する
  • OnDemand : 自動起動を一時停止し、イベント等の明示的な起動のみにする。
  • OtherJobEnabled

などなどのタイミングで起動することが出来る。

登録済みの一覧を見る

launchctl list

実行例

takuya@rena:~/Desktop$ launchctl list | head
PID     Status  Label
-       0       com.apple.CoreAuthentication.daemon
66801   0       com.apple.quicklook
-       0       com.apple.parentalcontrols.check
294     0       com.apple.Finder
1787    0       com.apple.xpc.launchd.oneshot.0x10000008.Karabiner_AXNotifier
-       0       com.apple.PackageKit.InstallStatus
-       0       com.apple.FontWorker

登録した詳細を見る

launchctl list  名前

実行例:実際のコマンド

takuya@rena:~/Desktop$ launchctl list  com.apple.wifi.WiFiAgent
{
        "LimitLoadToSessionType" = "Aqua";
        "MachServices" = {
                "com.apple.wifi.WiFiAgent" = mach-port-object;
        };
        "Label" = "com.apple.wifi.WiFiAgent";
        "TimeOut" = 30;
        "OnDemand" = true;
        "LastExitStatus" = 0;
        "PID" = 1260;
        "Program" = "/System/Library/CoreServices/WiFiAgent.app/Contents/MacOS/WiFiAgent";
        "PerJobMachServices" = {
                "com.apple.tsm.portname" = mach-port-object;
                "com.apple.CFPasteboardClient" = mach-port-object;
                "com.apple.axserver" = mach-port-object;
        };
};

登録内容をJSONで表示することが出来る。便利。

新規登録

なにかタスクを登録するには。

  1. xml で plist を作成
  2. launchctl load でロード
  3. launchctl list でロード確認

XML でplist を作成する

以下は、WiFiの接続状況を監視し、SSIDが変わればwispr的な何かを実行するプログラム。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>biz.takuya.wispr</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/ssid.rb</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/dev/null</string><!-- <string>/tmp/error</string> -->
    <key>StandardOutPath</key>
    <string>/dev/null</string>
    <key>WatchPaths</key>
    <array>
     <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
    </array>
  </dict>
</plist>
  • Label - String - ここが名前になる。list で表示される。ユニーク名をつける。ドメインの逆が一般的
  • ProgramArguments - ここに実行したいコマンドと、引数を書く
  • WatchPaths - 今回はファイル監視。監視するパスを書く
  • StandardOutPath/StandardErrorPath - STDOUT/STDERR のリダイレクト先

xmlを作ったら、シンタックスチェック

plutil -lint biz.takuya.wispr.plist

plutil コマンドで plist のシンタックスチェックを実行し、エラーをチェックすることが出来る。

launch load コマンドでロード

launchctl load hogehoge.xml.plist

ロードする

ロードの確認

launchctl list | grep <LABEL>

登録したものを削除する

launchctl unload <LABEL>

launch Agent のplist の記述方法詳細

man launchd.plist

関連資料

Gmail通知を快適に、自動起動、常駐させた。 - それマグで!

みんな大好き!man ページ

download-pdf