- PR -

Windowsサービスが自動開始されません

1
投稿者投稿内容
しろぱんだ
会議室デビュー日: 2006/03/28
投稿数: 11
投稿日時: 2006-03-28 11:43
初めまして、しろぱんだと申します。

現在、VS2003(C#)にてWindowsサービスを作成しています。
exeとしてビルドして、手動によるサービスのインストールを行ったのですが、スタートアップの種類が「自動」になっているにも関わらず、サービスをインストールしているサーバを再起動(もしくはシャットダウン後に起動)しても、サービスが開始されないという現象が起きています。
AutoLog を true にしているのですが、サービスの起動に失敗した旨のイベントログなどは全くありません。
(同様に、正常に起動した旨のイベントログもありません。)
但し、インストール直後の再起動だと開始されているようです。その後、再び再起動をかけると開始されません。

インストールしたサービスのプロパティを見ても、
「スタートアップの種類」=「自動」
「ログオン」=「ローカル システム アカウント」
となっており、特に問題がないように思えます。

手動で開始・停止を繰り返した場合は、正常に開始・停止を繰り返せます。

こういった現象に関して、何かご存知の方がいらっしゃいましたら、ご教示願えますでしょうか。
どうぞ宜しくお願いします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-28 11:50
他のサービスとの依存関係はないでしょうか。他のサービスが起動していなければ動かない
ようなものであれば、そのサービスに依存関係を設定してみてはどうでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-28 12:22
手動だと問題ないところからして、タイミングの問題でしょうね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
しろぱんだ
会議室デビュー日: 2006/03/28
投稿数: 11
投稿日時: 2006-03-28 13:25
ukさん、じゃんぬねっとさん、ご返答ありがとうございます。

作成したサービスは、ソケット通信用のサーバとして稼動させようと思っているアプリケーションなのですが(クライアントからの通信を受け、データベースを検索してその結果を返すような物です。データベースとの接続にはODBCを使用しています。)その場合、依存するサービスを調べるにはどうしたら良いのでしょうか。
サービスの一覧で説明を見ていくと、最低限「Workstation」が起動していなければいけないのかも、とは思うのですが、その判断が果たして合っているのかどうか。

また、依存関係のサービスが判明したとして、手動によるサービスのインストールを行っている場合は、別途レジストリを変更するバッチを流さなければならない、という事なのでしょうか。

質問ばかりで申し訳ありませんが、よろしくお願いします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-28 14:51
XPや2003Serverならsc.exeで登録ができます。W2Kならリソースキットに入っています。
http://support.microsoft.com/default.aspx?scid=kb;ja;251192
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2006-03-28 15:23
サービスのOnStartで何か重い処理を行っていませんか?

http://msdn.microsoft.com/library/ja/vbcon/html/vbwlkWalkthroughCreatingWindowsServiceApplication.asp
引用:

OnStart メソッドは、サービスの操作が開始された直後にオペレーティング システムに戻る必要があります。永久的に続くループやブロックは実行できません。単純なポーリング機構を設定する場合は、System.Timers.Timer コンポーネントを使用できます。OnStart メソッドで、コンポーネントにパラメータを設定し、Timer.Enabled プロパティを true に設定します。それにより、タイマがコード内で定期的にイベントを発生させ、その各時点でサービスが必要な監視操作を実行できます。

しろぱんだ
会議室デビュー日: 2006/03/28
投稿数: 11
投稿日時: 2006-03-28 16:48
ukさん、todoさん、ご返答ありがとうございます。

引用:

ukさんの書き込み (2006-03-28 14:51) より:
XPや2003Serverならsc.exeで登録ができます。W2Kならリソースキットに入っています。
http://support.microsoft.com/default.aspx?scid=kb;ja;251192


サーバのOSが Windows2000 SP4 ですので、まずはリソースキットを手に入れてからsc.exeについて調べてみようと思います。
情報のご提供ありがとうございます。

引用:

todoさんの書き込み (2006-03-28 15:23) より:
サービスのOnStartで何か重い処理を行っていませんか?

http://msdn.microsoft.com/library/ja/vbcon/html/vbwlkWalkthroughCreatingWindowsServiceApplication.asp
引用:

OnStart メソッドは、サービスの操作が開始された直後にオペレーティング システムに戻る必要があります。永久的に続くループやブロックは実行できません。単純なポーリング機構を設定する場合は、System.Timers.Timer コンポーネントを使用できます。OnStart メソッドで、コンポーネントにパラメータを設定し、Timer.Enabled プロパティを true に設定します。それにより、タイマがコード内で定期的にイベントを発生させ、その各時点でサービスが必要な監視操作を実行できます。




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

スキルアップ/キャリアアップ(JOB@IT)