Help us understand the problem. What is going on with this article?

go で Windows service を作成する

More than 3 years have passed since last update.

概要

golangでdaemonを作成しそれをWindowsに移植することになったので、golang製daemonをwindowsサービス化させるためのメモです。

手段

  1. NSSM (the Non-Sucking Service Manager)を使う方法

  2. kardianos/serviceを使う方法

の2通りの手段があるがあるようです。
前者は、NSSMというサービス登録ツールを利用してプログラムをサービスぽくWindowsに認識させる方法と、 後者は真面目にサービスプログラムらしく実装できるパッケージを使う方法となっています。

今回はkardianos/serviceを使う方法を紹介します。

kardianos/service

このパッケージは、Windowsサービスを作ることに特化したパッケージではなく、Linuxのupstartを使ったdaemonの作成や、MacOSのdaemonの作成にも対応しているようです。

使い方

使い方は、
service/simple/example/main.go 通りになるのですが、

とても簡単で、
ちょっとためしてみようと、exampleを書き写したのですが、
結局、doWork()にメイン処理を書くだけで、殆どオリジナルexampleそのままになりました。

https://github.com/masahide/test-winservice/blob/master/main.go

ビルド

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 を使いましょう。 イベントログのアプリケーションログに出力してくれます。
yamasaki-masahide
インフラ関連技術に興味があります。 暇があればgolangで何か作りたい
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした