web-dev-qa-db-ja.com

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

通常、このエラーが発生します:(ローカルコンピューターの「サービス名」サービスが開始してから停止します。他のサービスまたはプログラムが使用していない場合、一部のサービスは自動的に停止します)ドライブパスなど。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サービスを作成し、インストーラーをビルドする必要があるようです。この方法で、エラーが発生した場所を追跡できます。

94
Blackator

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

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

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

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

visual Studioをプロセスに接続して、デバッグ機能を向上させることができます。

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

36
Eyal H

次のようにプログラムを変更するだけで、既存のwindowsサービスconsoleに変換すると非常に便利です。この変更により、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
    }
}
9
Ben Anderson

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

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

3
shah

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

1
panini pitke

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

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

1
Emre Guldogan

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

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

0
rikitikitik

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

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

そのため、サービスは実行を続け、ontickファイルをコピーします。

お役に立てば幸いです。

0
Sethu

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

イベントログにアクセスしたときに、フィルタリングを試みました。イベントログが破損したことを通知します。

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

0
PanosPlat

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

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

0

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

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

0