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 stop mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
$ ps aux|grep -v grep|grep mysql
$
とします。ちゃんとプロセスも止まっています。
追記: 2016/04/26
start
stop
追記ここまで
使えるbrew services
のサブコマンドは以下の通り。
cleanup
: Get rid of stale services and unused plistslist
: List all services managed bybrew services
restart
: 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): http://www.rubydoc.info/github/Homebrew/brew/Formula.plist_options
startup
をtrue
にすればパッケージインストール時にplistがインストール時にインストールされます。
manual
の値を指定しておくと、上のメッセージの様に
これを使って手動で起動できるよというメッセージが出せます。
(そのコマンドはきちんと用意する必要があります。)
取り敢えず概要だけですが、実際書く時には mysqlとかServiceを使ってる物を参考にしながら、と言う感じで。