Windows にはサービスという概念があって、UNIX でいうデーモン的なことはこれを使えば実現できる(MSDN、Wikipedia)。サービスにはその停止や再起動などの要求に答える責任があるので、それらに対応していないアプリケーションをそのままサービスとして登録することはできないのだけど、任意のアプリケーションのラッパーとなるサービスアプリケーションが Microsoft によって提供されているので、これを使えば実現できる。
前準備
- srvany.exe (今回使用するラッパー)をインストールする。これは "Windows Server 2003 Resource Kit Tools" というのに同梱されている。
- サービス化したいアプリケーションを用意する。今回は mackerel-agent を自前ビルドした。
サービスとして登録する PowerShell スクリプト
汎用化はできてなくて、決め打ち。
install-mackerel-agent-service.ps1
これを実行する(PowerShell コンソールを起動して、\Path\To\Script.ps1
)と、管理者権限を求める UAC ダイアログが表示されたあと、管理者権限のコンソールが開き、自動で MackerelAgentService というサービスがインストールされる(起動はしない)。表示されたままのコンソールは閉じてもいいし、
sc.exe start MackerelAgentService
でサービスを起動することもできる。
ちなみにサービスの削除は sc.exe delete
で可能。
Mackerel への PC の登録、メトリックの投稿ができました。
解説
- PowerShell の New-Service コマンドレットを使って MackerelAgentService という名前で srvany.exe を登録する。
- その後レジストリを操作して srvany.exe に渡すパラメータを登録する。このパラメータが、サービス化したいコマンドになってればいいらしい。
- New-Item と Set-ItemProperty でレジストリを操作できる。これはファイルシステムに対しても同じように使える汎用的なコマンドレット。
- Start-Process コマンドレットに
-Verb RunAs
を指定すると、指定したコマンドを管理者権限で実行できる。 - powershell.exe は
-Command "& {<command>}"
を指定することで { … }
はスクリプトブロックと呼ばれる構文らしい。たぶん文字列化して渡してる気がするんだけど、この辺の正確な理解ができていない……。
参考
- ユーザー定義サービスの作成方法 - instsrv.exe の代わりに New-Service コマンドレットを利用した。
- PowerShell: ◆別の資格情報で管理者として実行する2
ちなみに NSSM - the Non-Sucking Service Manager ってのもあるらしい。