「サービス化の方法がよくわかりません」という声が多いので、SETI@homeクライアントの事例としてメモを残しました。
かなりいい加減な書き方になっているので、わからないところなどありましたらお教えくださればなるべくわかりやすい記述にするようにします。
さて、サービス化すると何がうれしいのでしょう?
「CPU利用の効率化」という観点で言うと、一番うれしいのは起動を忘れてCPUをあそばせることがないということでしょうか。サービスプログラムはスタートアップ時に自動実行するように設定しておけばWindows 2000 (NT)が起動した時点で必ず実行されるようになっています。したがって、Windowsを起動したそのときからシャットダウンするそのときまで、処理を続行しつづけることができます。
もう一つの利点はログオンしていなくても処理を行うことができるという点です。Windows 2000 (NT)はマルチユーザシステムですから、建前上は使い終わったらログオフする必要があります。ユーザがログオン後に動かしているプログラムの場合、ログオフすれば当然そのプログラムはとまってしまいますので、ログオンしていない間は非常に無駄なわけです。「そんなもん、ログオンしっぱなしにしておけばいいじゃん」と言われるかもしれませんが、もしかするとそのワークステーション(サーバ)は他の人も使うかもしれません(笑)。そんなときでもサービス化しておけばなんの問題もないわけです(なんか違う/爆)。
それでは実例と画面に沿ってサービス化の方法を説明していきます。今回、Windows 2000の場合を画面にとりましたが、基本的にWindows NTでも変わらないと思います。
SETI@homeのクライアントを置くディレクトリを作成し、コマンドライン版のクライアントプログラムをコピーします。SETI@homeのWindows版コマンドラインクライアントはWebサイトにおいてあるファイルがそのまま実行ファイルになっています。よくある自己解凍型のアーカイブではないので注意してください。
バージョン2.4の場合、ファイル名はsetiathome-2.4.i386-winnt-cmdline.exeとなっていますが、あまりにも長すぎますし、後ほど説明するプログラムファイル名の設定をバージョンアップごとに変えるのも面倒ですから、バージョンに依存しない名前に変えておくとよいでしょう。今回の事例ではsetiathome.exeという名前にしてあります。
INSTSRV.EXEを使って新しいサービスエントリを登録します。第一パラメータはサービス名、第二パラメータはサービスプログラム(今回の場合SRVANY.EXE)のフルパス名を指定します。一般的にパラメータの途中に空白などが入る場合は""で囲む必要がありますので注意してください。
サービスプログラムのパス名の入力時にはエクスプローラからのドラッグ&ドロップでファイルのフルパス名をコピーすることができます。多少入力の手間が軽減されますし、入力ミスをする心配もなくなりますのでぜひ活用してください。Windows NTのコマンドプロンプトの場合は""でクォートされませんので、プログラムのパス名の途中に空白が入る場合にはドラッグ&ドロップする前に"を入力しておき、パス名が表示された後に"で閉じる必要があります。Windows 2000のコマンドプロンプトでは自動的に""で囲まれますので特に気にする必要はないでしょう。
INSTSRV.EXEでSRVANY.EXEを登録しただけではSETI@homeのプログラムとして動かすことができませんので、レジストリエディタを使ってSETI@homeクライアントのパス名等を指示します。
注意: レジストリの操作には十分注意するようにしてください。念のためにバックアップを取ることを推奨します(私はまったくやってませんが/笑)。
さて、問題のレジストリエディタですが、あぶないプログラム(笑)なので「スタートメニュー→プログラム」からはアクセスできません(もちろん、私のように勝手にスタートメニューに入れている人は別です/爆)。ですから、スタートメニュー→ファイル名を指定して実行」のところでREGEDITと入力するか、エクスプローラの中でC:\WINNTを開いてそこにあるREGEDIT.EXEをダブルクリックするなどして起動してください。
レジストリエディタを起動したら、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\登録したサービス名のキーを開いてください。そこにはSecurityというサブキーとDisplayName, ErrorControl等のいくつかの値がすでに登録されていると思います。
サービス名のキーを開いたら、そこにSETI@homeクライアントのパス名などを登録するためのサブキーParametersを作成します。メニューから「編集→新規→キー」と選ぶか、右側の値が並んでいるサブウィンドウ内で「右クリック→新規→キー」とします(Windows NTのレジストリエディタの場合は新規の部分が新規作成になります)。すると、左側のツリー表示ウィンドウ内のサービス名のキーの下にNew Key #1というサブキーが生成され、編集可能な状態になるはずです。
そうしたら、そこですかさずParametersと打ち込みリターンを押しましょう。これでSETI@homeクライアントを指示するための領域ができました。
続いてサブキーParametersの下に文字列値を格納する領域Application, AppDirectory, AppParametersを作成します。今度はメニューから「編集→新規→文字列」と選び、New Value #1の部分をそれぞれ変更します。
次のステップでこの作成した領域に順次値を入れていきます。
文字列値Applicationにはサービスとして起動するプログラム本体のドライブ名を含むフルパス名を記述します。このとき、プログラムのパス名の途中に空白があったとしても""で囲む必要はありません。むしろ、囲むとサービスとして起動されなくなってしまいますので注意してください。
引き続き文字列値AppDirectoryにSETI@homeクライアントを動かすディレクトリ名を記述します。このエントリで指定したディレクトリ下にデータファイル(*.sah/Vertion 1.Xの場合は*.txt)が作成されますので、すでに運用中のクライアントをサービス化するような場合は間違えずに設定するようにしてください。
残ったAppParametersですが、ここにはSETI@homeクライアントの起動時に指定するパラメータを指定します。したがって、一般的には何も指定する必要はありません。ただし、プロバイダの都合などによってproxy経由でないと外部へのhttpアクセスができないような場合は-proxy proxyサーバ名:ポート番号をここで指示することになります。
特に指定する内容がない場合にはエントリごと削除してしまってもかまいませんが、そのまま値がなくてエントリだけになっていても問題はないはずです。後にパラメータを指定する必要が出た場合にエントリ名を調べて正確に入力するのも面倒なので(笑)、そのままにしておくのも悪くないかと思います。
各エントリに値を設定し終わったら、ツリービューの画面で内容をきちんと確認しておきましょう。この値が正確でないとサービスが起動しないか、データファイルが予想もしないところに作られるかしますので、何度も確認するようにしましょう。
レジストリエディタで必要な項目を設定したら「スタートメニュー→設定→コントロールパネル→管理ツール→サービス」(スタートメニューをカスタマイズして管理ツールを表示する設定にしていれば、「スタートメニュー→プログラム→管理ツール→サービス」)とたどってサービスアプレットを開きます。
Windows NTの場合はここの部分から大幅に違っています。逐次違いを説明していきますので、きちんと参照して冷静に対処してください。サービスアプレットは管理ツールの中ではなくコントロールパネルの中に直接配置されています。
ここで、設定したサービス名(例ではSETI@home)のエントリを選択して「操作→プロパティ」と選ぶか、ダブルクリックするとサービスのプロパティ(の一部)が編集できるようになります。
Windows NTではサービスアプレットのユーザインタフェースも大幅に違います。まず、メニューバーが存在しません。該当するサービスを選択したら右にボタンが並んでいますので、その中の「スタートアップ…」を押して処理を指示します。あるいは、該当するサービスのエントリをダブルクリックしてもかまいません。
特に必須なわけではありませんが、説明の部分がデフォルトでは空欄になっていますので、なにか説明を書いておいたほうがいいでしょう。
次にログオンタブをクリックしてください。ここではどのアカウント権限でサービスを起動するかを指定します。開いた時点ではINSTSRVを実行したユーザ名が入っていますので、ローカル システム アカウントに変更します。
SETI@homeクライアントをサービスとして実行するにあたって、コマンドプロンプトのウィンドウは全く必要ないのですが、最初に設定をするときだけはウィンドウを出して対話する必要があります。そのために、ログオンアカウント設定のところにあるデスクトップとの対話をサービスに許可をチェックします。
すでに稼動しているコマンドライン版クライアントをサービス化する場合には、このステップを省略してもかまいませんが、ディレクトリ設定などが間違っているとSETI@homeの処理が継続ではなく新規の扱いになってしまいます(当然、さまざまな設定を対話で行わないといけません)ので、その辺の確認も含めて一度対話処理をしておくとよいでしょう。
ここまでの設定が終わったら、一度ダイアログを閉じて設定した内容を確認しましょう。特にログオンユーザがきちんとローカルシステムになっているかと、もし設定していれば説明が(ものすごく頭の部分だけですが/笑)きちんと設定されているかどうかも確認しておくとよいでしょう。
内容を確認し終わったら、初期設定のために再度サービスのプロパティを開きます。
続いて初期設定(あるいは設定の確認)をするために開始ボタンを押します。すると、コマンドプロンプトのウィンドウが開いてSETI@homeクライアントが起動するでしょう。
すでに稼動していたクライアントをそのままサービスにした場合はいきなりDoing baseline smoothing.の画面になります(Step 4.-i.)が、そうでなければSETI@homeのアカウント登録の画面になります。
ここではすでに登録済みのアカウントを使う例を説明しますので、未登録の場合の設定はSETI@homeクライアントのマニュアルなどを参考にしてください。また、登録・ワークユニットの取得をこれから行いますので、この次のステップに進む前にインターネットに接続している必要があります。ネットへの接続は各自行ってください。そこまで面倒見きれない(笑)。
最初に未登録ユーザ(1.)か登録済みユーザ(2.)かの選択をします。ここでは登録済みユーザを示す2と入力してリターンを押しましょう。すると、メールアドレスを聞かれますので、SETI@homeにユーザ登録したときのメールアドレスを入力します。
正しく登録されているアドレスを入力すれば、ユーザ情報を取得後、早速ワークユニットをとりに行くはずです。10KBごとにReceiving Data: xxxKと表示されていきますので、340K〜351K程度の数字が表示されるまでじっと待ちましょう。その後、取得したワークユニットの情報を表示してDoing baseline smoothing.という表示になってとまるはずです。
ここまでくればワークユニットを取得して処理を開始している段階になっていますので、後は通常の設定に戻すだけです。
設定を変更するためにいったんサービスを停止します。普通ならばコマンドプロンプトの画面でCtrl-Cを押したりするのですが、ここではサービスのアプレットから操作を行います。(コマンドプロンプトがシステムアカウントで動いているので、Ctrl-Cではとまらないかもしれません)
サービスアプレットのプロパティ画面で停止ボタンを押してください。一時停止ボタンではだめだったと思います(設定が変更できない)。
通常はコマンドプロンプトの画面が出てもうっとおしいだけですし、ユーザの権限によっては開いているコマンドプロンプトの画面を閉じることによりサービスを停止してしまう原因にもなりかねないので、初期設定が済めばデスクトップとの対話は許可しない設定にしておきます。
対話の許可をはずして適用した後で再度サービスを開始しましょう。これで、あとはなにもすることはありません。たとえWindows 2000 (NT)システムを誰かが(笑)再起動したとしても、再起動時に自動的にサービスは起動されますので、システムが動いている限りSETI@homeクライアントも動きつづけることになります。
あとはひたすら計算あるのみ。がんばってくださいね。