Skip to main content.

cygrunsrv.README

cygrunsrv は、Cygwin に移植された UNIX デーモンプログラムを NT/2000/XP 上のサービスとして動作させるための、 サービススタータプログラムです。 本文書は、cygrunsrv 0.94 に含まれている cygrunsrv.README の日本語訳です。

cygrunsrv とは何ですか?

cygrunsrv は Microsoft の INSTSRV や SRVANY プログラム、 或いは FireDaemon プログラムに似た、NT/Windows 2000(W2K) サービススタータの実装の一つです。 しかし、cygrunsrv はそれ自身が cygwin プログラムなので、Cygwin アプリケーションを上手にサポートします。

何が出来るのですか?

cygrunsrv は二つの基本モードで動作します。 最初のモードは「サービス制御」又は「コマンドライン」モードです。 このモードではシステムレジストリへのサービスのインストールや削除が行え、 既にインストールされたサービスの起動と停止も可能です。 第二のモードは「サービスの実行」又は「デーモン化」モードです。 このモードは Windows のサービス制御マネージャから呼び出される、 特殊なエントリポイントからのみ実行されます。 コマンドラインから cygrunsrv をこのモードで動作させることは出来ません。 「デーモン化」モードでは、cygrunsrv は(「コマンドライン」モードで指定されたフラグに従って)環境を設定します。 cygrunsrv はターゲットとなるサービスが cygwin1.dll を簡単に見つけ出すことが出来るように、「/bin」を PATH の先頭に追加します。 (必要であれば)cygrunsrv は標準出力、標準入力、標準エラー出力をログファイルや NT/W2K イベントログにリダイレクトします(イベントログへのアクセスはまだ実装されていません)。 最後に、cygrunsrv はターゲットとなるデーモンを起動します。

どのようにして使うのですか?

簡単に開始出来るように、cygrunsrv の「サービス制御」又は「コマンドライン」モードでは 4 つの基本操作を実行出来ます。 サービスのインストール(-I 又は --install)、 サービスの削除(-R 又は --remove)、 サービスの開始(-S 又は --start)、 サービスの停止(-E 又は --stop)です。 加えて、cygrunsrv 自身に関する情報を出力する情報出力オプションがあります。 以下では各モードに関する詳細について説明します。

情報出力オプション

cygrunsrv -h
cygrunsrv --help

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

cygrunsrv -v
cygrunsrv --version

cygrunsrv 実行形式のバージョン情報を出力します。

サービスの削除

cygrunsrv -R <svc_name>
cygrunsrv --remove <svc_name>

レジストリからサービスを削除します。

サービスの開始

cygrunsrv -S <svc_name>
cygrunsrv --start <svc_name>

既にインストールされたサービスを開始します。

サービスの停止

cygrunsrv -E <svc_name>
cygrunsrv --stop <svc_name>

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

サービスのインストール

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

cygrunsrv --install svc_name --path /cygwin/style/path/to/daemon.exe

「svc_name」は、このサービスに対する情報を格納するレジストリ中のキーの名前であることに注意して下さい。 更に重要なことは、これがサービスマネージャコントロールパネルアプレットに表示される名前であり、 サービスを開始する際には「cygrunsrv --start」(又は net start)でこの名前が利用されるということです(--disp オプションについても参照して下さい)。 svc_name は実行ファイル名と同一である必要はありませんが、慣例として通常は同じ名前が利用されます。

様々な追加の、そしてオプションの引数を指定することが出来ます。

-a, --args <args>

ターゲットとなるサービスが起動する際に、コマンドラインオプションとして引き渡される追加文字列を指定します。 このオプションは一つだけ指定できます。 ターゲットとなるサービスが二つの引数と共に起動される場合、両方の引数をクォートで囲んで並べて下さい。 例えば、

cygrunsrv -I foo -p /usr/bin/bar -a "-D -e"

は「/usr/bin/bar -D -e」のように二つの引数を引き渡します。 もしスペースを含んだ単独の引数を指定する必要がある場合は、シングル(')又はダブル(")クォートで保護する必要があります。

  1. cygrunsrv -I foo -p /usr/bin/bar -a "\"foo bar\""
  2. cygrunsrv -I foo -p /usr/bin/bar -a "'foo bar'"
  3. cygrunsrv -I foo -p /usr/bin/bar -a '"foo bar"'

はそれぞれ以下のようになります。

  1. /usr/bin/bar "foo bar"
  2. /usr/bin/bar 'foo bar'
  3. /usr/bin/bar "foo bar"

(以下のような対称性が提案されていますが、まだ動作しません。私を信じていて下さい)。

cygrunsrv -I foo -p /usr/bin/bar -a '\'foo bar\''
-e, --env <VAR=value>

サービスが起動した際に環境変数として追加される、オプションの環境文字列を指定します。 複数の --env オプションを利用することによって、最大 255 個の環境変数文字列を指定することが可能です。 起動するアプリケーションが cygwin1.dll を発見することが出来るように、 「/bin:」は常にパスに追加されることに注意して下さい。 PATH=/a/path:/list を指定することも出来ますが、 それでも /bin は追加されることになります。

cygrunsrv -I foo -p /usr/bin/bar -e HOME=/e/services -e TMP=/var/tmp

シングル(')又はダブル(")クォートによる、単一レベルのクォートが利用可能です。

cygrunsrv -I foo -p /usr/bin/bar -e BAR="\"/d/My Documents/services\""

は、環境変数 BAR の値として引用符付きの"/d/My Documents/services"」を設定します (\ によるエスケープと外部のクォートは、コマンドそれ自身を bash から保護するために必要です)。 もしクォーティングに関するこの議論が理解出来ないとしても心配しないで下さい。恐らく貴方には関係がない話でしょう。

-d, --disp <display name>

サービスの表示名を指定するオプション文字列です。デフォルトの値はサービス名(svc_name)です。

cygrunsrv -I svc_name -p /usr/bin/svc.exe -d baz

は、デーモン svc.exe を実行するサービスを登録します。 このサービスのパラメータはレジストリキー「svc_name」 に格納されますが、サービスコントロールパネルアプレットには「baz」として表示されます。 「cygrunsrv -S svc_name」又は「net start svc_name」 を利用してこのデーモンを起動出来ますが -- 報告されるのは「baz サービスは正常に開始されました。」です。

-t, --type [auto|manual]

サービスの起動方法を指定するオプションです。 デフォルトは「auto」です(例えば、サービスはシステムの起動時に自動的に開始します)。 「manual」は、「cygrunsrv -S svc_name」 を明示的に利用してサービスは起動する必要があることを意味します。

-u, --user <user name>

サービスを開始するユーザを指定するオプションです。 デフォルトは SYSTEM アカウントです(「LocalSystem」アカウントとしても知られています)。

-w, --passwd <password>

ユーザのパスワードを指定するオプションです。 ユーザが指定された場合のみ必要となります。 ユーザのパスワードが空文字列の場合、「-w」と共に空の <password> を入力して下さい。

cygrunsrv -I svc_name -p /usr/bin/svc.exe -u foo -w ""

ユーザが指定されたにも関わらず -w オプションが指定されなかった場合、cygrunsrv は対話的にパスワードを尋ねます。 パスワードは暗号化された形式でレジストリ中に格納されることに注意して下さい。

-0, --stdin <file>

標準入力のリダイレクト用に利用される入力ファイルを指定します。 デフォルトは /dev/null です。

-1, --stdout <file>

標準出力のリダイレクト用に利用される出力ファイルを指定します。 デフォルトは /var/log/<svc_name>.log. です。

-2, --stderr <file>

標準エラー出力のリダイレクト用に利用される出力ファイルを指定します。 デフォルトは /var/log/<svc_name>.log. です (そのため、デフォルトでは標準出力と標準エラー出力は共に /var/log/<svc_name>.log. にリダイレクトされます)。

まもなく、ターゲットのサービスによって出力されるメッセージを NT/W2K イベントアプリケーションログへと格納するために、パイプ経由で logger プログラム(これは inetutils パッケージに含まれています) へとリダイレクトが可能になるでしょう。例えば以下のようになります。

これはまだ実装されていません!!!!
cygrunsrv -I svc_name -p /usr/bin/foo.exe \
  --stderr "|/usr/bin/logger -p INFO -t svc_name"
-s, --termsig <signal>

サービスを停止するためにサービスアプリケーションへと送信するシグナルを指定するためのオプションです。 <signal> には番号か、HUP、INT、QUIT のようなシグナルの名前が指定できます。 デフォルトは TERM ですが、これは殆どのデーモンに対して適切でしょう。

-y, --dep <svc_name2>

この新しいサービスを開始する前に開始しておかなければならないサービスの名称を指定するオプションです。 --dep オプションは他の依存するサービスを指定するために、最大 16 個まで設定することが出来ます。 依存ループに陥ることは避けて下さい。 これはつまり、svc_A は svc_B に依存しているが、しかし svc_B は svc_A に依存している…という状態です。

-o, --shutdown

cygrunsrv に対して、システムのシャットダウン時にサービスアプリケーションを停止させることを指示するオプションです。 この場合、cygrunsrv はシステムのシャットダウンを知った時点で、 アプリケーションプロセスに終了シグナル(--termsigを参照して下さい)を送信します。 これはアプリケーションが終了処理を行って正しく終了するために、幾ばくかの時間が必要な場合に指定して下さい。 システムのシャットダウン時には、個々の Cygwin プロセスも SIGHUP を自分自身に対して(暗黙のうちに)送信します。

一般的な注意点

しかしながら、警告すべきものが一つあります。 アプリケーションが「通常の」UNIX デーモンとして動作し、子プロセスを fork して終了する場合、cygrunsrv は直ちにサービスを停止します (しかし実際のデーモンはバックグラウンドで動作し続けます)。 これは即ち、cygrunsrv を使うなら明示的に「kill -9 <daemon_pid>」によって kill しない限り、デーモンを停止することが出来ないということを意味します。

これに失敗した場合、恐らく

Cygwin Apache : Win32 Process Id = 0xFE : Cygwin Process Id = 0xFE :
`Cygwin Apache' service stopped.

に続いて

Cygwin Apache : Win32 Process Id = 0xFE : Cygwin Process Id = 0xFE :
`Cygwin Apache' service started.

という出力が Windows のアプリケーションイベントログに現れるでしょう。 しかし「ps -eaf | grep httpd」ではまだ httpd が動作しているように見えます。

この問題を回避するには、デーモンを fork せずそのまま動作するプロセスとしてアプリケーションを起動する必要があります。 例えば sshd は -D オプションと共に起動する必要があります。 squid は -N オプションを指定して起動します。

オプションが必要となる場合は、以下のようにします。

cygrunsrv -I sshd -p /usr/sbin/sshd -a -D
cygrunsrv -I squid -p /usr/bin/squid -a -N

一般的な使用例 (しかし非常に有用です)

Cygwin アプリケーション /bin/foo を LocalSystem アカウントで動作するサービス「foo」としてインストールするなら、特別なオプションは必要ありません。

cygrunsrv -I foo -p /bin/foo

コマンドラインオプションを必要とするサービス「foo」として /bin/foo をインストールするには、以下のようにします。

cygrunsrv -I bar -p /bin/foo -a '--opt1 --opt2 -x'

スペースを含んだコマンドラインオプションを必要とするサービス「baz」として /bin/foo をインストールするには、

cygrunsrv -I baz -p /bin/foo -a "-x 'this has spaces inside'"

或いは

cygrunsrv -I baz -p /bin/foo -a '-x "this has spaces inside"'

とします。

システムの起動時に自動的に起動しないサービス「foo bar」として /bin/foo をインストールするには、以下のようにします。

cygrunsrv -I "foo bar" -p /bin/foo -t manual

正常に動作するには環境変数「ENV_VAR_1」及び 「ENV_VAR_2」を正しく設定する必要があるサービス「bongo」として /bin/foo をインストールするには、以下のようにします。

cygrunsrv -I bongo -p /bin/foo -e "ENV_VAR_1=important_1" \
      -e "ENV_VAR_2=also_important"

ユーザ「joey」アカウントとして動作するサービスとして sshd をインストールするには、以下のようにします。

cygrunsrv -I "Joey sshd" -p /usr/sbin/sshd -a '-d' -u joey

cygrunsrv は「joey」のパスワードを対話的に尋ねます。 もし joey のパスワード(例えば「privy23」)をコマンドラインから指定するのであれば、以下のようにします。

cygrunsrv -I "Joey sshd" -p /usr/sbin/sshd -a '-D' -u joey -w privy23

サービス「foo」を開始するには以下のようにします。

cygrunsrv -S foo

サービス「foo」を停止するには以下のようにします。

cygrunsrv -E foo

サービス「foo」を削除するには以下のようにします。

cygrunsrv -R foo

(一般的な Cygwin サービスに対する)特定の使用例

このリストに追加すべき提案をお願いします…。

PostgreSQL
cygrunsrv --install postmaster \
    --path /usr/bin/postmaster \
    --args "-D /usr/share/postgresql/data -i" \
    --dep ipc-daemon --termsig INT --user postgresql --shutdown
sshd
cygrunsrv --install sshd \
    --path /usr/sbin/sshd \
    --args -D

現在のところ ipc-daemon.exe と inetd.exe には cygrunsrv の援助なしに Windows サービスとして実行することが出来る追加のコードが含まれているということに注意して下さい。

連絡に関する情報

サポート及び連絡は cygwin メーリングリスト(cygwin@cygwin.com)へとお願いします。 cygrunsrv は元々、Corinna Vinschen によって作成されました。