それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

CygwinでWindowsサービスを作る。簡単だった。

Cygwinのcygrunsrvで手軽にWindowsサービスを作ることが出来る。簡単だった。どうして今までやらなかったのか後悔した。

やってみたら、拍子抜けするくらいに簡単だった。

Windowsサービスを作って制御する cygrunsrv.exe

ポイントは以下の3点

  1. Cygwin環境のスクリプトファイルをそのままサービスに出来る。
  2. shebangを使ったスクリプトがサービスになる。
  3. exeを作らなくても良い。

とりあえず作ってみました。

サンプルを使った例。

サンプルの流れはこんな感じ。

  • 1秒に一回ログに書き出す。rubyで。
  • サービス登録する。
  • 起動する
  • サービス起動を確認する
  • 停止する
  • 登録解除する。

rubyで無限ループを刷るプログラムを作る。

ruby で無限ループを作る。毎秒 /tmpにログを書き出す。

loop.rb
#!/usr/bin/env ruby
$stdout = open "/tmp/log.txt" , "w"
cnt = 0;
loop{
    cnt = cnt+1
    puts "#{cnt} : #{Time.now.strftime('%Y/%m/%d %H:%M:%S')}"
    $stdout.flush
    sleep 1
}

サービス登録する

chmod +x loop.rb 
cygrunsrv --install takuya_test --path /home/takuya/loop.rb

実験で登録してもすぐに消せる。なので、気にせず登録しちゃってください。

サービスを起動する

cygrunsrv --start takuya_test
起動を確認する。

ファイルに書き出されています。やったね

起動したらプロセスのオーナー情報を確認する。


ruby.exeとcygwinのサービスプログラムがSYSTEMで動作してます。

サービスを停止する

cygrunsrv --stop takuya_test

サービスを削除する

cygrunsrv --remove takuya_test

実験が終わったのでサービスの登録を解除する。

簡単ですね。

こんなに簡単にサービス作れるなら、どんどん活用しちゃってかまわない。

ポイントは shebang が解釈されること #!/usr/bin/rubyで起動するので楽ちん。

応用を考えてみる

rubyの win32-changenotifyでファイル更新監視とか
定期的にファイルを消すとか。
録画ファイルをffmpegにかけるとか

ちょっとしたスクリプトをDaemonize出来るのが便利そうでした

cygrunsrvの使い方

情報出力オプション
cygrunsrv -h
cygrunsrv --help

cygrunsrv に関する包括的なヘルプ及びオプションを列記します。
cygrunsrv -v
cygrunsrv --version

cygrunsrv 実行形式のバージョン情報を出力します。
サービスの削除
cygrunsrv -R
cygrunsrv --remove

レジストリからサービスを削除します。
サービスの開始
cygrunsrv -S
cygrunsrv --start

既にインストールされたサービスを開始します。
サービスの停止
cygrunsrv -E
cygrunsrv --stop

既にインストールされたサービスを停止します。
サービスのインストール

最低限、以下のオプションと引数を指定する必要があります (勿論、--install そして --path の代わりに短縮形オプション -I そして -p を利用することが出来ます)。
cygrunsrv --install svc_name --path /cygwin/style/path/to/daemon.exe

http://www.sixnine.net/cygwin/translation/software/cygrunsrv.html

cronは?

cronも使えるよ。cronはcron-configというコマンドが用意されていて、そっちで常駐する。これはまた別記事に書きますね。