112

通常、このエラーが発生します: (ローカル コンピューターの "サービス名" サービスが開始されてから停止しました。他のサービスまたはプログラムで使用されていない場合、一部のサービスは自動的に停止します) 存在しないなど、コードに何か問題がある場合ドライブ パスなど。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 サービスが開始されました。フォルダーの場所に戻すと、機能しませんでした。私が思うに、フォルダーの場所はファイルウォッチャーでは機能しません。

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

4

11 に答える 11

213

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

  1. Windowsイベント ビューアを参照してください。通常、コンピューター/サーバー マネージャーに移動し、[イベント ビューアー] -> [ Windows ログ] -> [アプリケーション] をクリックすると、これにアクセスできます。ここで何が例外をスローしたかを確認できますが、これは役立つかもしれませんが、スタック トレースは得られません。
  2. プログラム ロジックをライブラリ クラス プロジェクトに抽出します。ここで、コンソール アプリ (デバッグ用) と Windows サービスの 2 つの異なるバージョンのプログラムを作成します。(これは最初の努力ですが、長い目で見れば多くの心配を省くことができます。)
  3. アプリに try/catch ブロックとログを追加して、何が起こっているかをよりよく把握します。
于 2012-08-31T04:59:41.863 に答える
37

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

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

Visual Studio をプロセスにアタッチしてデバッグ機能を向上させるよりも。

これがお役に立てば幸いです、幸運を祈ります

于 2012-08-31T05:44:51.637 に答える
4

すべての HTTP エンドポイントがローカル マシンのアクセス コントロール リスト (ACL) に登録されていることを確認してください

http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html

于 2013-10-13T09:30:57.177 に答える
2

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

于 2015-10-20T06:02:09.293 に答える
1

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

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

于 2019-02-15T12:10:56.230 に答える
0

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

あなたwatcherの型FileSystemWatcherはローカル変数であり、OnStartメソッドが実行されるとスコープ外になります。おそらくインスタンス変数またはクラス変数として必要です。

于 2012-08-31T05:59:01.577 に答える
0

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

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

イベントログをクリアしましたが、すべて問題ありません。

于 2014-07-25T11:05:43.450 に答える
0

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

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

そのため、サービスは実行を続け、オンティックにファイルをコピーします。

それが役立つことを願っています。

于 2012-08-31T05:03:21.407 に答える
0

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

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

于 2012-08-31T05:31:37.590 に答える