HomebrewはMacのパッケージマネージャーですが、 plistの管理の記述があるパッケージに関しては、 Homebrew側でサービス(Macのlaunchctlで管理するもの)を管理する事が出来ます。
homebrew-services
Homebrew Servicesはレポジトリをtapするとservicesという Homebrewのサブコマンドが使える様になります。
serviceではなくてservicesと複数形なのでちょっと注意。 (Linuxとかだと/sbin/serviceとかが単数形なので。)
tapすると、と書きましたが、実際には servicesコマンドを使おうとすると勝手にtapされるので 自分でtapする必要はありません。
使うのはmysqlの様なバックグラウンドジョブとして 走らせたい様なコマンドです。
mysqlをHomebrewでインストールすると、
$ brew install mysql
...
To have launchd start mysql now and restart at login:
brew services start mysql
Or, if you don't want/need a background service you can just run:
mysql.server start
...
こんな感じのメッセージが出ます。
ここにある通りstartしてみると
$ brew services start mysql
==> Tapping homebrew/services
Cloning into '/usr/local/Library/Taps/homebrew/homebrew-services'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
Checking connectivity... done.
Tapped 0 formulae (32 files, 46K)
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)
と、行った感じで動き出した感じ。 (Tapping...Tappedの行は最初にbrew srevicesを使った時だけ servicesコマンドをtapするために実行されます。)
実際にmysqlが走ったかどうか見てみると、
$ ps aux|grep -v grep|grep mysql
user 58161 0.0 1.0 3533824 172828 ?? S x:xxxx 0:00.35 /usr/local/Cellar/mysql/5.7.12/bin/mysqld --basedir=/usr/local/Cellar/mysql/5.7.12 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/5.7.12/lib/plugin --bind-address=127.0.0.1 --log-error=/usr/local/var/mysql/myMac.local.err --pid-file=/usr/local/var/mysql/myMac.local.pid
user 58065 0.0 0.0 2446700 1184 ?? S x:xxxx 0:00.02 /bin/sh /usr/local/opt/mysql/bin/mysqld_safe --bind-address=127.0.0.1 --datadir=/usr/local/var/mysql
と、mysqlが動いているのが分かります。 止める方法が書いてありませんが、止めるにはstopを使って、
$ brew services start mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
$ ps aux|grep -v grep|grep mysql
$
とします。ちゃんとプロセスも止まっています。
使えるbrew servicesのサブコマンドは以下の通り。
cleanup: Get rid of stale services and unused plistslist: List all services managed bybrew servicesrestart: Gracefully restart service(s)start: Start service(s)stop: Stop service(s)
listは
$ brew services list
Name Status User Plist
mysql started user /Users/user/Library/LaunchAgents/homebrew.mxcl.mysql.plist
syncthing stopped
こんな感じで表示されます。
ここで、Plistの欄がありますが、services startすると、 plistがLaunchAgentsディレクトリ等ににコピーされ、以後、 自動で起動時などに読み込まれてコマンドを起動したりする様になります。
通常startすると/Users/user/Library/LaunchAgents/にインストールされて userのログイン時に、 sudo brew start cmdと、sudoを使うと /Library/LaunchDaemonsにインストールされOS起動時にスタートさせる事が出来ます。
一方、services stopするとプロセスを止めると同時にこのplistも削除してくれます。
起動時にコマンドを起動するかどうかは、plistを削除しなくても 中のRunAtLoadの値をfalseにしたりすることで変更も出来るのですが、 一応読み込まれてしまうのとアンインストール時にゴミが残ってしまったりする 可能性もあるのでbrew servicesでは都度削除しているようです。
ちょっとずれますが、上のアプリを作る時にもそんな感じで起動時に使うか使わないかで その時々でplistを削除、インストールしたりするようにしています。
servicesという名前がLinuxのserviceコマンドに名前が似ていますが、 こちらのbrew servicesはどちらかと言うとLinuxのchkconfigの様な サービスの登録のコマンド、と思っていいと思います。
また、メッセージに書いてあるように
$ mysql.server start
としてもmysqlをスタートできます。 ただし、この場合はplistはインストールされず、 再起動時などにはスタートしません。
この場合も止めたい場合は
$ mysql.server stop
で手動で止められます。
$ mysql.server
Usage: mysql.server {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
と、これで見れる様にこのコマンドがLinuxのservice mysql的なコマンドになっています。
この様にstartした場合には brew services listではstoppedと表示されます。
brew services listはplistがインストールされているかどうか、 だけを見ていて、start、stopはコマンド自体の実行状態、ではなく サービスとしてどう登録されているか、の表示になっている様です。
一方で、services startして実行している状態だと
$ mysql.server status
SUCCESS! MySQL running (60428)
の様に、こちらでは実際に実行していることが確認できます。
ただし、このLinuxのservice的な物はHomebrew Serviceに登録する際必須なものではなくて、 mysqlの場合はこんな感じでserviceっぽくしてありますが、 他のものだと単に起動コマンドがあるだけで、
Or, if you don't want/need a background service you can just run:
cmd
みたいな表示が出て、実際cmdを実行するとそのサービスが起動できる、 と言うだけのものもあります。 (stopとかstatusとか出来ない。また、単にコマンドを起動するだけなのでバックグラウンドジョブにも直接はならない。)
mysql.serverに関してはLinux等でも/etc/init.dにインストールするのと同じ ファイルを使ってるみたいです。
GUIで管理
上のサービスですが、GUIから管理するアプリも開発されています。
インストールは
$ brew cask install launchrocket
インストールするとシステム環境設定の一番下にLaunchRocketが現れ、 それをクリックすると
こんな感じの表示が。
ここでstart、stopが出来ます。 ただし、ここでのstart、stopは上の mysql.server start/stopに当たるもので、 plistの管理はしません。
別途、At Root、At Loginというチェックボタンがあって、 これらにチェックを入れると それぞれ、 /Library/LaunchDaemons、 /Users/user/Library/LaunchAgents/にplistがインストールされ、 外すとplistが削除されます。
ちょっと面倒なのが、このアプリ自体ではplistの存在をチェックしたりは出来てないようで(バグ?)、 brew services startした状態でもAt Loginにチェックが入っていません。
ここで、At Loginに一度チェックを入れて外すと plistが削除され、もう一度チェックを入れるとまたインストールされます。
なのでサービスが起動している、していない、をチェックするのには GUIで出来て分かりやすい、と言うこともあるかもしれませんが、 サービスの管理、と言う意味では現在の状況をきちんと把握出来ないので微妙です。
また、ここでAt Loginに一度チェックをいれ外して plistを削除してしまうと、 brew services listではstoppedになります。 コマンドラインからstopするにはbrew services stop mysqlではできず、 mysql.server stopが正しいコマンドになります。
コード読んだりしてませんが、 おそらく、状態の確認やstart、stopに関して、 直接プロセスを確認したり、mysql.serverの様なコマンドを使ってstart/stopしている感じ。
また、At Login等のチェックに関しては単に plistを直接コピーしたり削除したりしているだけかと。
さらに、右にRemoveボタンがありますが、これは一時的にこの表示から消すだけで、 Scan Homebrewをすると元に戻るので実質何もしません。
ということで、これらをきちんと把握していれば使うのもまあありかもしれませんが、 コマンドラインでパッと見たほうが楽かな、と。
Formulaの書き方
取り敢えず使うだけの場合は特に気にしなくて良いところですが、 自分でサービスとして使う様なパッケージを作ってFormulaを作りたい時どうするか、 という点についてちょっとメモ。
mysqlのFormulaを見てみると、 def plistと言う項目があります。
このplistが定義されているとHomebrewはインストール時に Serviceを持ってるパッケージだと認識してくれる様です。
また、上に書いたインストール時に出てくるメッセージも plistが定義されていると自動で表示される様になるみたいです。
plist自体は通常のMacのplistで、RunAtLoad等の設定が見れますが、 Labelにplist_nameという値が入ってますが、これは homebrew.mxcl.<package>の様な形になり、 plistのファイル名も**homebrew.mxcl.
opt_binとかはHomebrewの変数で、 **$(brew –prefix)/opt/
opt_binはパッケージのレポジトリの構造そのままにコピーされた状態+α、的な感じの所です、多分。
($(brew –prefix)/binにもインストールされてるので #{bin}でも良さそうなものですが、plistで使う場合には 大体opt_binの方を見ている模様。)
このplistは **$(brew –prefix)/opt/
/usr/local/opt/mysql/homebrew.mxcl.mysql.plist等。
brew services startするとここからコピーされます。
また、Formulaの中ではplist_optionsという値を設定できて、
Method: Formula.plist_options — Documentation for Homebrew/brew (master)
startupをtrueにすればパッケージインストール時にplistがインストール時にインストールされます。 manualの値を指定しておくと、上のメッセージの様に これを使って手動で起動できるよというメッセージが出せます。 (そのコマンドはきちんと用意する必要があります。)
取り敢えず概要だけですが、実際書く時には mysqlとかServiceを使ってる物を参考にしながら、と言う感じで。