ローカルコンピューター上のWindowsサービスが開始し、停止したエラー


104

通常、次のエラーが表示されます:(ローカルコンピュータの「サービス名」サービスが開始されてから停止されました。他のサービスまたはプログラムで使用されていない場合、一部のサービスは自動的に停止します)存在しないなど、コードに問題がある場合ドライブパスなど。Windowsサービスは開始されません。

サイズ制限に達した場合に、フォルダ/ファイルを特定の場所にバックアップするWindowsサービスがあります。詳細はすべて、Windowsサービスが起動時に読み取るXML構成によって提供されます。私は、Windowsサービスのonstartが実行していることを正確に実行するボタンを持つ、別のWindowsフォームを持っています。私は自分のWindowsサービスに配置する前に、Windowsフォームを使用してコードをデバッグします。

Windowsフォームを起動すると、それはそれがすることを想定していることをします。コードをWindowsサービスのOnStart()メソッドに配置すると、エラーが表示されました。

これが私のコードです:

protected override void OnStart(string[] args)
{

    private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
    private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
    private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";

    protected override void OnStart(string[] args)
    {
        if (File.Exists(backupConfig))
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            XmlTextReader reader = new XmlTextReader(backupConfig);

            XmlNodeType type;
            List<string> listFile = new List<string>();
            string fileWatch = "";

            //this loop is for reading XML elements and assigning to variables
            while (reader.Read())
            {
                type = reader.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader.Name == "File")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                    else if (reader.Name == "Folder")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                }
            }
            reader.Close();

            watcher.Path = fileWatch;
            watcher.Filter = "*.*";

            //this loop reads whether the service will watch a file/folder
            XmlTextReader reader1 = new XmlTextReader(backupConfig);
            while (reader1.Read())
            {
                type = reader1.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader1.Name == "File")
                    {
                        watcher.IncludeSubdirectories = false;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFile);
                    }
                    else if (reader1.Name == "Folder")
                    {
                        watcher.IncludeSubdirectories = true;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
                    }
                }
            }
            reader1.Close();

            watcher.EnableRaisingEvents = true;

        }
        else
        {
            StreamWriter sw = new StreamWriter(serviceStat, true);
            sw.WriteLine("File not found. Please start the Log Backup UI first.");
            sw.Close();
        }
    }

Windowsサービスが開始されない原因はわかりません。Windowsフォームシミュレータは正常に動作しました。問題であると想定されるのは?

更新:多くの試行の後、フォルダーディレクトリ(ファイルなし)のみを使用すると、Windowsサービスが機能しないことに気付きました。fileWatch変数を特定のファイル(そのディレクトリを含む)に置き換えたところ、Windowsサービスが開始しました。フォルダーの場所に戻したところ、機能しませんでした。私が思うに、フォルダの場所はfilewatcherでは機能しません。

フォルダーの場所を監視する新しいWindowsサービスを作成しようとしたところ、うまくいきました。しかし、元のWindowsサービスで同じ場所を試しましたが、うまくいきませんでした。私は気をつけていました$#* ed!新しいコード/関数を配置するたびに、新しいWindowsサービスを作成してインストーラーをビルドする必要があるようです。このようにして、エラーが発生した場所を追跡できます。

回答:


202

そのようにサービスが開始および停止する場合は、コードが未処理の例外をスローしていることを意味します。これはデバッグがかなり困難ですが、いくつかのオプションがあります。

  1. Windows イベントビューアを参照してください。通常は、コンピューター/サーバーマネージャーに移動し、[ イベントビューアー] -> [ Windowsログ] -> [ アプリケーション ]をクリックすることでアクセスできます。ここで例外をスローした原因を確認できますが、これは役立つ場合がありますが、スタックトレースを取得できません。
  2. プログラムロジックをライブラリクラスプロジェクトに抽出します。次に、プログラムの2つの異なるバージョンを作成します。コンソールアプリ(デバッグ用)とWindowsサービスです。(これは少し初期の作業ですが、長期的には多くの不安を軽減します。)
  3. 何が起こっているかをよりよく把握するために、try / catchブロックとログをアプリに追加します。

10
Windowsイベントビューアーは、完全なスタックトレース、非常に役立つツールを示しました。
Talha Imam

37

これが役立つかどうかはわかりませんが、サービスをデバッグするために、OnStartメソッドで常に次のものを使用できます。

protected override void OnStart(string[] args)
{
     System.Diagnostics.Debugger.Launch();
     ...
}

ビジュアルスタジオをプロセスに接続し、より優れたデバッグ能力を持つことができます。

これがお役に立てば幸いです


これは断然最良の解決策です(少なくとも私にとって)。VS 2015もこれをうまく処理します。私にとっては、JITデバッガーのUAC確認ダイアログがポップアップ表示され、VS 2015をデバッガーとして選択しました。
スミティ

9

次のようにプログラムを変更するだけで、既存のWindowsサービスコンソールに変換するのが非常に便利です。この変更により、Visual Studioでデバッグするか、通常の実行可能ファイルを実行してプログラムを実行できます。ただし、Windowsサービスとしても機能します。それについてもブログ投稿しました

program.cs

class Program
{
    static void Main()
    {
        var program = new YOUR_PROGRAM();
        if (Environment.UserInteractive)
        {
            program.Start();
        }
        else
        {
            ServiceBase.Run(new ServiceBase[]
            {
                program
            });
        }
    }
}

YOUR_PROGRAM.cs

[RunInstallerAttribute(true)]
public class YOUR_PROGRAM : ServiceBase
{
    public YOUR_PROGRAM()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Start();
    }

    protected override void OnStop()
    {
        //Stop Logic Here
    }

    public void Start()
    {
        //Start Logic here
    }
}


2

EventLog.Logは「アプリケーション」として設定する必要があります


これが実際に私に対する問題の解決策だったので、私は賛成しました
Savage

1

一方、別の理由:誤って.configファイルを削除すると、同じエラーメッセージが表示されます:

「ローカルコンピュータのサービスが開始されてから停止されました。一部のサービスは自動的に停止します...」


0

タイマーとティックイベントを使用してファイルをコピーします。

サービスの開始時に、時間を開始し、時間の間隔を指定します。

したがって、サービスは実行を続け、ファイルをオンティックでコピーします。

お役に立てば幸いです。


0

初期化を単体テストすることもできますが、OnStartこれはメソッド内にあるため、ほとんど不可能です。初期化コードを別のクラスに移動して、テストしたり、少なくともフォームテスターで再利用したりできるようにすることをお勧めします。

次に、(Log4Netなどを使用して)いくつかのログを追加し、いくつかの詳細なログを追加して、ランタイムエラーの詳細を確認します。ランタイムエラーの例は、AccessViolation特に、構成ファイルにアクセスするための十分な権限なしでサービスが実行されている場合などです。


0

サービスを実行しているアカウントがD:ドライブをマップしていない可能性があります(これらはユーザー固有です)。ディレクトリを共有して、で完全なUNCパスを使用してみてくださいbackupConfig

あなたのwatcherタイプのFileSystemWatcherローカル変数であり、そして時に範囲外であるOnStart方法が行われています。おそらくインスタンスまたはクラス変数として必要です。


0

私は同じ問題に出くわしました。私のサービスはXMLSをアップロード/受信し、エラーをイベントログに書き込みます。

イベントログに行ったとき、それをフィルタリングしようとしました。イベントログが破損しているというメッセージが表示されます。

イベントログをクリアし、すべてOKです。


0

私たちの場合、問題のあるサービスが開始されて停止されたというログを除いて、Windowsイベントログには何も追加されませんでした。

サービスのCONFIGファイルが無効であることがわかりました。無効なCONFIGファイルを修正すると、問題が修正されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.