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

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

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

Re[6]: サービスOnShutdown時に一定時間処理をさせたい


(過去ログ 118 を表示中)

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

■69311 / inTopicNo.1)  サービスOnShutdown時に一定時間処理をさせたい
  
□投稿者/ まり (1回)-(2013/12/16(Mon) 12:22:22)

分類:[VB.NET/VB2005 以降] 

いつも参考にさせてもらっています。またよろしくお願いします

WindowService内OnShutDown時に一定の処理を実行させてたいのですが(例えば5分)
およそ2分でシャットダウン処理が終わってしまいます
ログにも"シャットダウン完了"が記録されません
OnStopは正常に動作します

何か考えられる原因&解決策はないでしょうか?

試したこと
・CanShutDownをTrueに設定
・レジストリ 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeoutを360000に設定
・下記修正プログラム適用(実運用環境ではインストールできず)
http://support.microsoft.com/kb/2549760/ja

環境(どちらも動作しません)
・テスト環境
Windows7SP1 FrameWork2.0
・実運用環境
WindowsServer2008Sp1 FrameWork2.0


サンプルのテストプログラム
Public Class ServiceTest
    Const RunningTime As Integer = 5 * 60 * 1000 '最大で一時間くらい
    Const CheckTime As Integer = 4 * 1000
    Const WaitTime As Integer = 5 * 1000
    Private Running As Boolean

    Protected Overrides Sub OnStart(ByVal args() As String)
        PutLog("サービス開始")
    End Sub

    Protected Overrides Sub OnStop()
        PutLog("サービスストップ開始")
        ExecuteWait()
        While Running
            Me.RequestAdditionalTime(CheckTime)
            System.Threading.Thread.Sleep(WaitTime)
        End While
        PutLog("サービスストップ完了")
    End Sub

    Protected Overrides Sub OnShutdown()
        PutLog("シャットダウン開始")
        ExecuteWait()
        While Running
            System.Threading.Thread.Sleep(WaitTime)
        End While
        PutLog("シャットダウン完了")
        MyBase.OnShutdown()
    End Sub

    Private Delegate Sub AsyncMethodCaller(<Runtime.InteropServices.Out()> ByRef ThreadId As Integer)

    Private Sub CallbackMethod(ByVal ar As IAsyncResult)
        Dim Result As Runtime.Remoting.Messaging.AsyncResult = CType(ar, Runtime.Remoting.Messaging.AsyncResult)
        Dim Caller As AsyncMethodCaller = CType(Result.AsyncDelegate, AsyncMethodCaller)
        Dim ThreadId As Integer = 0
        Caller.EndInvoke(ThreadId, ar)
    End Sub

    Private Sub ExecuteWait()
        Running = True
        Dim Caller As New AsyncMethodCaller(AddressOf WaitAsync)
        Dim ThreadId As Integer = 0
        Dim Result As IAsyncResult = Caller.BeginInvoke(ThreadId, AddressOf CallbackMethod, Nothing)
    End Sub

    Private Sub WaitAsync()
        System.Threading.Thread.Sleep(RunningTime)
        Running = False
    End Sub

    Public Overloads Sub PutLog(ByVal ParamArray MessageList() As String)
        'ログ出力
        Try
            If MessageList IsNot Nothing Then
                Dim LogFileName As String = My.Application.Info.DirectoryPath + "\" + ServiceName + Today.ToString("yyyyMMdd") + ".log"
                Using File As New IO.FileStream(LogFileName, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.Read)
                    Using LogStream As New System.IO.StreamWriter(File, System.Text.Encoding.GetEncoding("Shift-Jis"))
                        Dim LogValue As String = Now.ToString("yyyy/MM/dd HH:mm:ss.fff")
                        For Each Message As String In MessageList
                            LogValue += ",""" + Message.Replace("""", """""") + """"
                        Next
                        LogStream.WriteLine(LogValue)
                        LogStream.Flush()
                    End Using
                End Using
            End If
        Catch ex As Exception
        End Try
    End Sub
End Class

引用返信 編集キー/
■69313 / inTopicNo.2)  Re[1]: サービスOnShutdown時に一定時間処理をさせたい
□投稿者/ オショウ (111回)-(2013/12/16(Mon) 13:50:55)
No69311 (まり さん) に返信
> いつも参考にさせてもらっています。またよろしくお願いします
>
> WindowService内OnShutDown時に一定の処理を実行させてたいのですが(例えば5分)
> およそ2分でシャットダウン処理が終わってしまいます
> ログにも"シャットダウン完了"が記録されません
> OnStopは正常に動作します
>
> 何か考えられる原因&解決策はないでしょうか?

  それは、OSの仕様なので、無理です。

  OnShutDownイベントが発生したら、迅速に終わりましょう!

以上。
引用返信 編集キー/
■69314 / inTopicNo.3)  Re[2]: サービスOnShutdown時に一定時間処理をさせたい
□投稿者/ オショウ (112回)-(2013/12/16(Mon) 13:56:54)
補足
ttp://msdn.microsoft.com/ja-jp/magazine/cc164252.aspx

ただし
ttp://attosoft.info/blog/item-nowaittokillservicetimeout/
ttp://d.hatena.ne.jp/ladybug/touch/20120808
こんなこともある。

よって、専用サーバーで専用のwindowsサービスを作っている場合を除き
OnShutDownイベントには迅速に終わるのがよいでしょう。

以上。参考まで
引用返信 編集キー/
■69331 / inTopicNo.4)  Re[3]: サービスOnShutdown時に一定時間処理をさせたい
□投稿者/ a (1回)-(2013/12/17(Tue) 11:24:53)
No69314 (オショウ さん) に返信
> 補足
> ttp://msdn.microsoft.com/ja-jp/magazine/cc164252.aspx
>
> ただし
> ttp://attosoft.info/blog/item-nowaittokillservicetimeout/
> ttp://d.hatena.ne.jp/ladybug/touch/20120808
> こんなこともある。
>
> よって、専用サーバーで専用のwindowsサービスを作っている場合を除き
> OnShutDownイベントには迅速に終わるのがよいでしょう。
>
> 以上。参考まで
引用返信 編集キー/
■69333 / inTopicNo.5)  Re[4]: サービスOnShutdown時に一定時間処理をさせたい
□投稿者/ a (2回)-(2013/12/17(Tue) 11:57:27)
名前部分で間違えてEnter押したら投稿になってしまった。orz
編集キー入れる前だから編集もできない。

併せて、シャットダウンをキャンセルする方法を探した方がいいかも。

ユーザーがシャットダウン→OnShutdown発生→シャットダウンキャンセル→任意の終了処理→プログラム内からシャットダウン

見たいな流れにできると良さそう。
※うまくキャンセルできたとしても周りのサービスが死んでる可能性があるので正しく処理できるかは微妙ですが。
 サーバーの初期設定時に必要なサービスを関連サービスとしてバリバリ登録していけばいいのかな?(未経験なので分からないですね)

サービスではなく一般アプリなら「OSに対してキャンセルメッセージ送る」とか「コマンドラインで"shutdown /a"」とか「CloseでCancel=true???」でキャンセルできないかな。

時間を引き延ばすならOnShutdownではなくOnStopでRequestAdditionalTime設定して引き伸ばせるかどうかかと。
引用返信 編集キー/
■69334 / inTopicNo.6)  Re[5]: サービスOnShutdown時に一定時間処理をさせたい
□投稿者/ まり (2回)-(2013/12/17(Tue) 12:38:54)
・オショウさん情報ありがとうございます

時間延長は無理だと言う事理解しました
制限時間内に処理を終わらせる方向で考えます

・aさん情報ありがとうございます

キャンセルするという発想がありませんでした。非常に助かります
しかし、若干問題がありました。
シャットダウンか再起動かを判断する方法が見つからず
1.キャンセル→2.処理終わらせる→3.再び(シャットダウンor再起動)
3の工程にてどちらかが判断できず実行できません

引用返信 編集キー/
■69335 / inTopicNo.7)  Re[6]: サービスOnShutdown時に一定時間処理をさせたい
□投稿者/ まり (3回)-(2013/12/17(Tue) 12:42:45)
解決チェック忘れてました
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -