C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

サービスのOnStopについて

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■92210 / inTopicNo.1)  サービスのOnStopについて
  
□投稿者/ るし (1回)-(2019/09/02(Mon) 11:28:28)

分類:[C#] 

2019/09/02(Mon) 11:49:12 編集(投稿者)

.Net4.5 C# Windows7 32bit

お世話になります。
Windowsサービスについて教えてください。
アプリケーションにてServiceControllerを使ってサービスの開始、停止を制御しています。
とあるサービス(他社作成)の停止において、時々ですが例外エラーが発生し、原因調査をしています。

サービス停止は
try
{
sc.Stop()
}
catch (InvalidOperationException err)
{
Log.Write("E", string.Format("サービス停止異常:{0}", err.Message));
Log.Write("E", err.InnerException.Message);
}
のように実装しており、ログには

****************
サービス停止異常:'172.17.5.104' コンピューターのHogeClientService サービスを停止できません。
そのサービスを開始できませんでした。
****************

のように記録されました。
1行目はいいのですが、2行目はなぜか「サービス開始失敗」と記録されています。
err.InnerException.Messageは何の情報がでているのでしょうか?
※サービス側プログラム自体が設定したメッセージがでている、ということはないでしょうか?


試験的にCanStopプロパティをfalseにしたサービス(中身は何もしない)を作って登録し、アプリからサービス停止をかけてみた場合のログは以下の内容でした。
****************
サービス停止異常:'127.0.0.1' コンピューターの HogeTest サービスを停止できません。
要求された制御はこのサービスに対して無効です。
****************
これは正常だと思います。


もう1点質問です。
サービス側のOnStop関数ですが、この関数の中でサービス停止をキャンセルすることは可能でしょうか?
※CanStopプロパティはOnStopが呼ばれる以前に判定されると思うのでこれではないように思いますが。

よろしくお願いします。



引用返信 編集キー/
■92211 / inTopicNo.2)  Re[1]: サービスのOnStopについて
□投稿者/ 魔界の仮面弁士 (2347回)-(2019/09/02(Mon) 11:59:39)
No92210 (るし さん) に返信
> catch (InvalidOperationException err)
> {
>  Log.Write("E", string.Format("サービス停止異常:{0}", err.Message));
>  Log.Write("E", err.InnerException.Message);
> }
InnerException は null となる可能性があるかも?

> err.InnerException.Messageは何の情報がでているのでしょうか?
停止処理の中で、動作していないサービスを使用しようとしていたとか…?


> ※サービス側プログラム自体が設定したメッセージがでている、ということはないでしょうか?
独自の物である可能性を否定することは出来ませんが、
そのメッセージ自体は、標準的なエラーとして登録されているものの一つのようです。
http://j.mp/2Pxuz34
引用返信 編集キー/
■92215 / inTopicNo.3)  Re[1]: サービスのOnStopについて
□投稿者/ とっちゃん (625回)-(2019/09/02(Mon) 13:49:09)
No92210 (るし さん) に返信
> ****************
> サービス停止異常:'172.17.5.104' コンピューターのHogeClientService サービスを停止できません。
> そのサービスを開始できませんでした。
> ****************
>
> のように記録されました。
> 1行目はいいのですが、2行目はなぜか「サービス開始失敗」と記録されています。
> err.InnerException.Messageは何の情報がでているのでしょうか?
> ※サービス側プログラム自体が設定したメッセージがでている、ということはないでしょうか?
>
こちらのエラーは、ERROR_SERVICE_NOT_ACTIVE(1062) だと思います。

なんでこのエラーが出てるのか?についてはわかりません(情報不足)。


> もう1点質問です。
> サービス側のOnStop関数ですが、この関数の中でサービス停止をキャンセルすることは可能でしょうか?
> ※CanStopプロパティはOnStopが呼ばれる以前に判定されると思うのでこれではないように思いますが。
>
> よろしくお願いします。
>
これは、サービス内部側でサービス停止を途中でキャンセルしたいということでしょうか?

ちょっと状況が飲み込めないのですが、ServiceBase の派生クラスの OnStop が呼ばれても
特定の条件が成立したら、Stop 処理をやめたいという認識であっていますか?

引用返信 編集キー/
■92216 / inTopicNo.4)  Re[2]: サービスのOnStopについて
□投稿者/ るし (3回)-(2019/09/03(Tue) 10:04:42)
魔界の仮面弁士様、とっちゃん様
お世話になります。コメント、ありがとうございます。

>InnerException は null となる可能性があるかも?
ドキュンメント見るとそうですね。これは修正いたします。

> これは、サービス内部側でサービス停止を途中でキャンセルしたいということでしょうか?
>
> ちょっと状況が飲み込めないのですが、ServiceBase の派生クラスの OnStop が呼ばれても
> 特定の条件が成立したら、Stop 処理をやめたいという認識であっていますか?

上記認識であっています。

よろしくお願いします。
引用返信 編集キー/
■92222 / inTopicNo.5)  Re[3]: サービスのOnStopについて
□投稿者/ とっちゃん (626回)-(2019/09/03(Tue) 11:26:51)
No92216 (るし さん) に返信
>>これは、サービス内部側でサービス停止を途中でキャンセルしたいということでしょうか?
>>
>>ちょっと状況が飲み込めないのですが、ServiceBase の派生クラスの OnStop が呼ばれても
>>特定の条件が成立したら、Stop 処理をやめたいという認識であっていますか?
>
> 上記認識であっています。
>
OnStop が呼ばれたのにサービスを停止させないというのはできません。残念ですが OS が最初から
そういう風に決めて設計しているので覆すにはOSごと作り変えるしかありません。

なので、サービスの停止コマンドを受け入れない場合は、CanStop = false; と事前に設定しておくしかありません。

一応、Windows のサービスのリファレンスのルートを張っておきますね(英語しかありませんが、説得材料にする場合にはここから探してください)。
https://docs.microsoft.com/en-us/windows/win32/services/services

.NET ならできる(だとできない)というものではないので、もし停止要求を条件ブロックさせたいということなら
通常のアプリケーションとして作成しておき、スタートアップに登録するなど自動で起動する形にしておくことをお勧めします。

引用返信 編集キー/
■92224 / inTopicNo.6)  Re[4]: サービスのOnStopについて
□投稿者/ Hoge (2回)-(2019/09/03(Tue) 14:01:37)
2019/09/03(Tue) 14:03:00 編集(投稿者)


削除
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ