- PR -

アプリケーションが原因でOSがシャットダウンできない理由

投稿者投稿内容
プロスト
会議室デビュー日: 2006/10/12
投稿数: 10
投稿日時: 2007-09-20 09:08
こんにちは。

現在、Windows Server 2003 SP1の環境で開発した常駐アプリを動作させています。

常駐アプリはVC++6.0SP6で作成したものです。

通常ですと、特に問題もなく、動作していましたが、ここ最近、OSのシャットダウンができないことが数回あります。(ほんとにまれです)

常駐アプリ(exe)をタスクマネージャから停止させるとOSのシャットダウンができるようになります。

それなら、常駐アプリが悪いんじゃん!!

ということで、アプリケーションによってOSのシャットダウンが停止する原因を調べたところ、OSのシャットダウン時には、OSから各アプリケーションにWM_QUERYENDSESSIONメッセージが飛ばされる。
このメッセージに対してFALSEを返却するとOSのシャットダウンがキャンセルされる。
ということでした。

しかしながら、現在の常駐アプリではこの部分は常にTRUEを返却しているため、FALSEを返すことはありません。

上記以外でアプリケーションが原因でOSのシャットダウンがキャンセルされることはあるのでしょうか?

または、シャットダウンがキャンセルされる理由を突き止める方法(ツールなど)がありましたらご教授ください。

以下のようにシャットダウン処理に入ってからの進行状況表示を行う方法はあったのですが、実際に知りたいのはその少し前?の進行状況になります。

http://support.microsoft.com/kb/325376/ja

よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-22 19:31
クロスポスト リンク。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2160925&SiteID=7

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2007-10-04 15:13
問題は、
WM_QUERYENDSESSIONメッセージにTRUEを返した後に、
自分自身が終了処理に向かってるかどうかではないでしょうか。

タスクマネージャから終了させるとどんなメッセージが来るのでしょうか?
または、有無を言わさず強制終了されるのでしょうか?
プロスト
会議室デビュー日: 2006/10/12
投稿数: 10
投稿日時: 2007-10-18 12:27
deannaさん 回答ありがとうございます。

常駐アプリなので自分自身は終了しません。

ログオフしても、対象アプリは動作したままです。
色々やっていると、1回目のログオフは成功するが、
2回目のログオフができなくなることがわかりました。
この状況になると、シャットダウンもできなくなります。

deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2007-10-18 13:31
引用:

プロストさんの書き込み (2007-10-18 12:27) より:

常駐アプリなので自分自身は終了しません。



常駐アプリであってもシャットダウン時には終了しないとだめでしょう。
ログオフとシャットダウンを混同してませんか?
プロスト
会議室デビュー日: 2006/10/12
投稿数: 10
投稿日時: 2007-10-19 11:05
deannaさん 回答ありがとうございます。

引用:

deannaさんの書き込み (2007-10-18 13:31) より:

常駐アプリであってもシャットダウン時には終了しないとだめでしょう。
ログオフとシャットダウンを混同してませんか?



シャットダウン時には、OSからkillされるという解釈は間違ってますか?

お作法的には、シャットダウンメッセージを受けたら、
自身の処理の終了処理を行う。
という指摘はわかりますが、別に明示的に終了処理を行わなくても
問題ないと考えています。
明示的に終了処理を行っていないプログラムなんて世の中いくらでも
ありますよね?

また、通常の運用内では、現在のコードでも問題なく、ログオフ、
シャットダウンが可能です。

色々調査をしたところ、以下の結論に達しています。

当件を質問する際の提示情報が少なかったのですが、
詳細に記述すると以下になります。

常駐プロセスはRPCを受信するサーバ側のプロセスです。
RPC経由でクライアントからのメッセージを受信後、
常駐プロセス内でスレッドを作成し、その中で
リスナ(ソケット)を作成しています。

・クライアントからのメッセージ受信がない場合
 →常にログオフ、シャットダウンが可能
・クライアントからのメッセージ受信があった場合
 →2回目のログオフ、シャットダウンができなくなる。

色々プロトタイプを作成したところ、
RPC経由でリスナ(ソケット)を作成する組み合わせに
問題があることがわかりました。
スレッド内でリスナ(ソケット)を作成することを
止めたところ、ログオフ、シャットダウンともに
正常動作することが確認できました。

なんでRPC経由内でリスナを作成してるんだ?
という部分は突っ込まないでください。
(モジュールの共通化の兼ね合いで結果的にそうなってしまった)

しかし、なぜ、上記のような組み合わせで、シャットダウンにまで
影響がでるのか分かりません。
恐らくRPCがENDQUERYSESSIONでFALSE(シャットダウンキャンセル)を
OSに返却していると予想されますが、その証拠がとれません。

やはり、シャットダウン時にFALSE(シャットダウンキャンセル)を
返却しているプロセスはどれか、追跡できるようなツールが
ほしいところです。

そんなツールはないものでしょうか?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-10-19 11:44
引用:

プロストさんの書き込み (2007-10-19 11:05) より:
シャットダウン時には、OSからkillされるという解釈は間違ってますか?


間違ってます。
プロセスを強制終了するとデータが失われる可能性があります。
したがってシャットダウン時に、アプリケーション自身が終了処理を完了するのをまたずに、プロセスを停止してしまうことはありません。数十秒間にわたって応答が無い場合は、サービスやデバイスドライバを強制終了しますが、GUIアプリケーションに関してはユーザに問い合わせるダイアログをOSが表示します。

きちんと終了処理をおこなわないと、シャットダウンに異常に時間がかかったり、あるいはイベントログがエラーでいっぱいになったりします。

引用:

明示的に終了処理を行っていないプログラムなんて世の中いくらでも
ありますよね?


あると思っているなら、例を上げてもらえますか?

引用:

常駐プロセスはRPCを受信するサーバ側のプロセスです。
RPC経由でクライアントからのメッセージを受信後、
常駐プロセス内でスレッドを作成し、その中で
リスナ(ソケット)を作成しています。


ソケットってMFCのCSocket?
CSocketは非表示のウィンドウを生成してメッセージを処理するのでその関係じゃないかな?CSocketはあまり出来がよくないので、使わないほうがよいよ。

引用:

やはり、シャットダウン時にFALSE(シャットダウンキャンセル)を
返却しているプロセスはどれか、追跡できるようなツールが
ほしいところです。


Spy ++
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2007-10-19 11:48
引用:


しかし、なぜ、上記のような組み合わせで、シャットダウンにまで
影響がでるのか分かりません。
恐らくRPCがENDQUERYSESSIONでFALSE(シャットダウンキャンセル)を
OSに返却していると予想されますが、その証拠がとれません。

やはり、シャットダウン時にFALSE(シャットダウンキャンセル)を
返却しているプロセスはどれか、追跡できるようなツールが
ほしいところです。

そんなツールはないものでしょうか?




Visual Studio .NET 2003のtoolのspy+で可能なのでは。

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