概要
golangでdaemonを作成しそれをWindowsに移植することになったので、golang製daemonをwindowsサービス化させるためのメモです。
手段
の2通りの手段があるがあるようです。
前者は、NSSMというサービス登録ツールを利用してプログラムをサービスぽくWindowsに認識させる方法と、 後者は真面目にサービスプログラムらしく実装できるパッケージを使う方法となっています。
今回はkardianos/serviceを使う方法を紹介します。
kardianos/service
このパッケージは、Windowsサービスを作ることに特化したパッケージではなく、Linuxのupstartを使ったdaemonの作成や、MacOSのdaemonの作成にも対応しているようです。
使い方
使い方は、
service/simple/example/main.go 通りになるのですが、
とても簡単で、
ちょっとためしてみようと、exampleを書き写したのですが、
結局、doWork()にメイン処理を書くだけで、殆どオリジナルexampleそのままになりました。
ビルド
Macでコンパイルするので、Go のクロスコンパイル環境構築を参考にコンパイル環境の準備をします。 といっても以下のコマンド一発です。
$ cd $(go env GOROOT) # go をインストールしたディレクトリに移動
$ cd src # その下の src
$ GOOS=windows GOARCH=amd64 ./make.bash
あとはリポジトリ上で、以下のようにOSを指定してビルドを実行します。
$ GOOS=windows GOARCH=amd64 go build
上側がMac版バイナリでexeがwindowsです。 ずいぶん大きさが違いますね。
$ ls
-rwxr-xr-x 1 masahide staff 4106960 12 14 15:47 test-winservice
-rwxr-xr-x 1 masahide staff 2509824 12 14 16:39 test-winservice.exe
実行方法
exampleのまま作成すると以下のようにコマンドでサービスの登録や実行などが行えます。
C:\Users\Masahide\Desktop>test-winservice.exe install
Service "Go Service Test" installed.
C:\Users\Masahide\Desktop>test-winservice.exe start
Service "Go Service Test" started.
C:\Users\Masahide\Desktop>test-winservice.exe stop
Service "Go Service Test" stopped.
C:\Users\Masahide\Desktop>test-winservice.exe remove
Service "Go Service Test" removed.
その他
- 標準出力などの出力はどうなるの?
-> イベントログのアプリケーションログとして出力されます。- -> service.Logger を使いましょう。 イベントログのアプリケーションログに出力してくれます。