Yerel Bilgisayardaki Windows hizmeti başlatıldı ve ardından hatası durduruldu


105

Genellikle şu hatayı alıyorum: (Yerel Bilgisayardaki "hizmet adı" hizmeti başlatıldı ve sonra durdu. Bazı hizmetler başka hizmetler veya programlar tarafından kullanılmıyorsa otomatik olarak durur) kodumda, var olmayan gibi bir sorun olduğunda sürücü yolları, vb. Windows hizmeti başlamaz.

Klasörü / dosyaları, boyut sınırına ulaştıysa bir konuma yedekleyen bir Windows hizmetim var. Ayrıntıların tümü, Windows hizmetinin başlangıçta okuduğu bir XML Yapılandırması tarafından sağlanır. Windows hizmetimin onstart'ın yaptığı şeyi tam olarak yapan bir düğmeye sahip ayrı bir windows formum var. Windows formlarımı, kodu Windows hizmetime koymadan önce hata ayıklamak için kullanıyorum.

Windows formlarımı başlattığımda. Yapması gerekeni yapıyor. Kodumu Windows hizmeti OnStart () yöntemine koyduğumda hata ortaya çıktı.

İşte kodum:

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 servisinin başlamamasına neyin sebep olduğunu bilmiyorum, windows form simülatörü iyi çalıştı. Sorun ne gibi görünüyor?

GÜNCELLEME: Birçok denemeden sonra, yalnızca bir klasör dizini (dosya olmadan) kullandığımı fark ettim, Windows hizmeti çalışmıyor. FileWatch değişkenini belirli bir dosyayla (dizini dahil) değiştirdiğimde, Windows hizmeti başladı. Onu bir klasör konumuna geri değiştirdiğimde işe yaramadı. Bence klasör konumları bir dosya izleyicide çalışmıyor.

Bir klasör konumunu izleyen yeni bir Windows hizmeti oluşturmaya çalıştığımda işe yaradı .. Ancak, orijinal Windows hizmetimde aynı konumu denediğimde işe yaramadı! Aklımdaydım! Görünüşe göre yeni bir Windows hizmeti oluşturmam ve her yeni kod / işlev yerleştirdiğimde yükleyiciyi oluşturmam gerekiyor. Bu şekilde nerede hata aldığımı takip edebilirim.

Yanıtlar:


204

Hizmet böyle başlar ve durursa, kodunuzun işlenmemiş bir istisna attığı anlamına gelir. Bu, hata ayıklaması oldukça zordur, ancak birkaç seçenek vardır.

  1. Windows Olay Görüntüleyicisi'ne danışın . Normalde buna bilgisayar / sunucu yöneticisine gidip ardından Olay Görüntüleyicisi -> Windows Günlükleri -> Uygulama'yı tıklayarak ulaşabilirsiniz. Burada istisnayı neyin fırlattığını görebilirsiniz, bu yardımcı olabilir, ancak yığın izini alamazsınız.
  2. Program mantığınızı bir kütüphane sınıfı projesine çıkarın. Şimdi programın iki farklı sürümünü oluşturun: bir konsol uygulaması (hata ayıklama için) ve Windows hizmeti. (Bu biraz başlangıç ​​çabasıdır, ancak uzun vadede çok fazla endişeden tasarruf sağlar.)
  3. Neler olup bittiğini daha iyi anlamak için daha fazla dene / yakala bloğu ekleyin ve uygulamaya giriş yapın.

10
Windows Olay Görüntüleyicisi tam yığın izini gösterdi, çok yardımcı bir araç.
Talha Imam

37

Bunun yararlı olacağından emin değilim, ancak bir hizmette hata ayıklamak için, OnStart yönteminde her zaman aşağıdakileri kullanabilirsiniz:

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

görsel stüdyonuzu sürece ekleyebileceğinizden ve daha iyi hata ayıklama yeteneklerine sahip olabileceğinizden daha fazla.

umarım bu yardımcı olmuştur, bol şans


Bu açık arayla en iyi çözümdür (en azından benim için). VS 2015 bunu da güzel bir şekilde ele alıyor. Benim için JIT hata ayıklayıcı için bir UAC onay iletişim kutusu açtı ve ardından hata ayıklayıcı olarak VS 2015'i seçmeme izin verdi.
Smitty

9

Aşağıdaki ile programınızı değiştirerek mevcut Windows hizmetinizi bir konsola dönüştürmeyi çok kullanışlı buldum . Bu değişiklikle programı görsel stüdyoda hata ayıklayarak veya çalıştırılabilir dosyayı normal şekilde çalıştırarak çalıştırabilirsiniz. Ama aynı zamanda bir pencere servisi olarak da çalışacaktır. Ben de bununla ilgili bir blog yazısı yaptım

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 "Uygulama" olarak ayarlanmalıdır


Bu benim için sorunun çözümü olduğu için az önce oy verdim
Savage

1

Bu arada, başka bir neden: .config dosyasının yanlışlıkla silinmesi aynı hata mesajının görünmesine neden oldu:

"Yerel bilgisayardaki hizmet başlatıldı ve sonra durduruldu. Bazı hizmetler otomatik olarak durur ..."


0

Zamanlayıcıyı kullanın ve dosyalarınızı kopyalamak için olayı işaretleyin.

Servisi başlattığınızda, zamanı başlatın ve zaman içindeki aralığı belirtin.

Böylece hizmet çalışmaya devam eder ve dosyaları tek tek kopyalar.

Umarım yardımcı olur.


0

Başlatmayı birim test etmek isteyebilirsiniz - ancak OnStart yöntemde olduğu için bu neredeyse imkansızdır. Başlatma kodunu ayrı bir sınıfa taşımayı öneririm, böylece test edilebilir veya en azından bir form test cihazında yeniden kullanılabilir.

İkinci olarak, bazı günlükler eklemek ( Log4Net veya benzerini kullanarak ) ve çalışma zamanı hataları hakkındaki ayrıntıları görebilmeniz için bazı ayrıntılı günlükler eklemek. Çalışma zamanı hatalarına örnekler, AccessViolationözellikle hizmetiniz yapılandırma dosyalarına erişmek için yeterli ayrıcalıklar olmadan çalışıyorsa vb. Olabilir.


0

Hizmeti çalıştıran hesap, D: -drive ile eşleşmemiş olabilir (bunlar kullanıcıya özeldir). Dizini paylaşmayı deneyin ve .dizinizde tam UNC yolunu kullanın backupConfig.

Sizin watchertürünüz FileSystemWatcheryerel bir değişkendir ve OnStartyöntem tamamlandığında kapsam dışındadır . Muhtemelen bir örnek veya sınıf değişkeni olarak buna ihtiyacınız vardır.


0

Ben de aynı sorunla karşılaştım. Hizmetim XMLS yüklüyor / alıyor ve hataları Olay Günlüğüne yazıyor.

Olay Günlüğüne gittiğimde onu filtrelemeye çalıştım. Olay Günlüğünün bozulmuş olduğunu gösteriyor.

Olay Günlüğünü temizledim ve hepsi tamam.


0

Bizim durumumuzda, Windows Olay Günlüklerine, sorunlu hizmetin başlatıldığı ve ardından durdurulduğu günlükler dışında hiçbir şey eklenmedi.

Hizmetin CONFIG dosyasının geçersiz olduğu ortaya çıktı. Geçersiz CONFIG dosyasını düzeltmek sorunu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.