[Mac] ユーザログイン時にスクリプトを実行する方法

2017.05.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

LaunchAgents

PC 起動後のユーザーログイン時にスクリプトを実行する手段はいくつかあると思いますが、今回は LaunchAgents という仕組みについて説明します。

LaunchAgents は macOS の launchd というサービスによって管理されるプロセスであり、ユーザーがログインしたときにロードされます。
この仕組を利用してユーザーログイン時にスクリプトを実行してみます。

処理を実行するためには ~/Library/LaunchAgents に XML 形式で命令を記述した plist ファイルを配置します。
ユーザーログイン時にこのパスに存在するファイルが読み込まれ、必要に応じて処理が実施されます。

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>com.example.hello</string>
    <key>ProgramArguments</key>
    <array>
      <string>hello</string>
      <string>world</string>
    </array>
  </dict>
</plist>

辞書のトップレベルにある LabelProgramArguments は共に必須のキーです。

  • Label
    • 起動する launchd プロセスで一意の文字列
  • ProgramArguments
    • プロセス起動の引数

実験

それでは LaunchAgents を利用して、デスクトップに helloworld という空ファイルを作成してみましょう。

まずは ~/Library/LaunchAgentscom.example.touch.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>com.example.touch</string>
    <key>ProgramArguments</key>
    <array>
      <string>touch</string>
      <string>/Users/tanakakeisuke/Desktop/helloworld</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

上記は touch コマンドを実行する処理です。
tanakakeisuke の部分は自分のユーザー名に置き換えてください。
また、このパスは絶対バスで書かなければいけないようで、~/ では上手く動作しません。
キー RunAtLoad はロードされたときに処理を行うというオプションで、こちらを true に設定します。

ここまでできたら以下のコマンドを実行し、シンタックスエラーがないかチェックしてみます。

$ plutil -lint com.example.touch.plist

問題なければ以下のメッセージが出力されます。

com.example.touch.plist: OK

ログアウト -> ログインで試してもいいのですが、launchctl コマンドを用いて手動でロードすることもできます。
以下のコマンドを実行してみましょう。

$ launchctl load com.example.touch.plist

どうでしょうか。
デスクトップに helloworld という空ファイルは作成されましたか?
もし作成されない場合は、標準出力と標準エラー出力を設定してデバッグしてみましょう。

<key>StandardOutPath</key>
<string>/Users/tanakakeisuke/Desktop/standard_out.txt</string>
<key>StandardErrorPath</key>
<string>/Users/tanakakeisuke/Desktop/standard_error.txt</string>

何度かロードを試したい場合は一度アンロードをする必要があります。

$ launchctl unload com.example.touch.plist

上手く行ったら今度は実際にログアウトしてからログインして動作を確認してみましょう。

さいごに

LaunchAgents はユーザーログイン時に処理を実行するための macOS が提供する便利な仕組みです。
定期的に処理を実行することもできるので、興味のある方は使ってみてはいかがでしょうか。

リンク

ミレニアム・ファルコン製作日記 #68

68 号 表紙

mfd_68_1

パーツ

mfd_68_2

mfd_68_3

mfd_68_4

成果

mfd_68_5

今回の作業は以下の 1 つでした。

  • 外殻プレートを組み立てる

船体後方にある機関室部分を覆う外殻プレートを組み立てました。
それだけ!

それではまた次回。

May the Force be with you!