- - PR -
Windowsサービスが自動開始されません
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-28 11:43
初めまして、しろぱんだと申します。
現在、VS2003(C#)にてWindowsサービスを作成しています。 exeとしてビルドして、手動によるサービスのインストールを行ったのですが、スタートアップの種類が「自動」になっているにも関わらず、サービスをインストールしているサーバを再起動(もしくはシャットダウン後に起動)しても、サービスが開始されないという現象が起きています。 AutoLog を true にしているのですが、サービスの起動に失敗した旨のイベントログなどは全くありません。 (同様に、正常に起動した旨のイベントログもありません。) 但し、インストール直後の再起動だと開始されているようです。その後、再び再起動をかけると開始されません。 インストールしたサービスのプロパティを見ても、 「スタートアップの種類」=「自動」 「ログオン」=「ローカル システム アカウント」 となっており、特に問題がないように思えます。 手動で開始・停止を繰り返した場合は、正常に開始・停止を繰り返せます。 こういった現象に関して、何かご存知の方がいらっしゃいましたら、ご教示願えますでしょうか。 どうぞ宜しくお願いします。 | ||||||||||||
|
投稿日時: 2006-03-28 11:50
他のサービスとの依存関係はないでしょうか。他のサービスが起動していなければ動かない
ようなものであれば、そのサービスに依存関係を設定してみてはどうでしょうか。 | ||||||||||||
|
投稿日時: 2006-03-28 12:22
手動だと問題ないところからして、タイミングの問題でしょうね。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-03-28 13:25
ukさん、じゃんぬねっとさん、ご返答ありがとうございます。
作成したサービスは、ソケット通信用のサーバとして稼動させようと思っているアプリケーションなのですが(クライアントからの通信を受け、データベースを検索してその結果を返すような物です。データベースとの接続にはODBCを使用しています。)その場合、依存するサービスを調べるにはどうしたら良いのでしょうか。 サービスの一覧で説明を見ていくと、最低限「Workstation」が起動していなければいけないのかも、とは思うのですが、その判断が果たして合っているのかどうか。 また、依存関係のサービスが判明したとして、手動によるサービスのインストールを行っている場合は、別途レジストリを変更するバッチを流さなければならない、という事なのでしょうか。 質問ばかりで申し訳ありませんが、よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-03-28 14:51
XPや2003Serverならsc.exeで登録ができます。W2Kならリソースキットに入っています。
http://support.microsoft.com/default.aspx?scid=kb;ja;251192 | ||||||||||||
|
投稿日時: 2006-03-28 15:23
サービスのOnStartで何か重い処理を行っていませんか?
http://msdn.microsoft.com/library/ja/vbcon/html/vbwlkWalkthroughCreatingWindowsServiceApplication.asp
| ||||||||||||
|
投稿日時: 2006-03-28 16:48
ukさん、todoさん、ご返答ありがとうございます。
サーバのOSが Windows2000 SP4 ですので、まずはリソースキットを手に入れてからsc.exeについて調べてみようと思います。 情報のご提供ありがとうございます。
OnStartでは、 1.ソケット通信の為のlistenerのソケットを生成 2.ログファイルにサーバを開始した旨のテキストを書き出し 3.クライアントの接続要求の受け入れを開始 という処理を行っています。 このOnStartメソッド以前、つまりメインエントリポイントで、コンフィグファイルの読み込みを行っていました。 static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; // ※※ コンフィグの読み込み ※※ // XMLファイルをデシリアライズして、 // ログファイルのパスや待機するポート番号、データベース接続文字列 // 等をスタティックな変数に格納していました。 if(MyConfigInfo.LoadConfigSettings()) { ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MySocketService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); } } このようなコードを書いていたのですが、Mainは static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MySocketService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); } だけにして、OnStartメソッドでコンフィグの読み込みを行うように変更したら、再起動後も自動的にサービスが開始するようになりました。 なぜ、前者のようなコードを書いていたかと言うと、コンフィグファイルが読み込めなかったらサービスを開始しない、といった事を行いたかったからです。 とりあえずは自動にサービスが開始するようにはなりましたが、問題の根本的な解決にはなっておりませんので、引き続き調べてみたいと思います。 |
1