Layanan Windows di Komputer Lokal dimulai dan kemudian menghentikan kesalahan

105

Biasanya, saya mendapatkan kesalahan ini: (Layanan "nama layanan" di Komputer Lokal dimulai dan kemudian dihentikan. Beberapa layanan berhenti secara otomatis jika tidak digunakan oleh layanan atau program lain) ketika ada yang salah dengan kode saya, seperti tidak ada jalur drive, dll. Layanan windows tidak akan dimulai.

Saya memiliki layanan windows yang mencadangkan folder / file, ke lokasi jika mencapai batas ukuran. Detail semuanya disediakan oleh Konfigurasi XML yang dibaca oleh layanan windows saat dimulai. Saya memiliki formulir windows terpisah yang memiliki tombol yang melakukan persis apa yang dilakukan layanan windows saya. Saya menggunakan formulir windows saya untuk men-debug kode sebelum saya memasukkannya ke dalam layanan windows saya.

Ketika saya memulai bentuk jendela saya. Itu melakukan apa yang seharusnya dilakukan. Ketika saya meletakkan kode saya di layanan windows metode OnStart () kesalahan muncul.

Ini kode saya:

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();
        }
    }

Saya tidak tahu apa yang membuat layanan windows tidak dimulai, simulator bentuk windows berfungsi dengan baik. Apa masalahnya?

UPDATE: Setelah banyak percobaan saya perhatikan bahwa hanya menggunakan direktori folder (tanpa file), layanan windows tidak berfungsi. Ketika saya mengganti variabel fileWatch dengan file tertentu (termasuk direktorinya), layanan windows dimulai. Ketika saya mengubahnya kembali ke lokasi folder, itu tidak berhasil. Menurut saya, lokasi folder tidak berfungsi di filewatcher.

Ketika saya mencoba membuat layanan windows baru yang melihat lokasi folder, itu berhasil .. Namun, ketika saya mencoba lokasi yang sama di layanan windows asli saya, itu tidak berhasil! Saya mindf $ # * ed! Sepertinya saya harus membuat layanan windows baru dan membangun penginstal setiap kali saya menempatkan kode / fungsi baru .. Dengan cara ini saya dapat melacak di mana saya mendapatkan kesalahan.

Blackator
sumber

Jawaban:

203

Jika layanan dimulai dan berhenti seperti itu, itu berarti kode Anda mengeluarkan pengecualian yang tidak tertangani. Ini cukup sulit untuk di-debug, tetapi ada beberapa opsi.

  1. Konsultasikan dengan Windows Event Viewer . Biasanya Anda dapat melakukannya dengan membuka manajer komputer / server, lalu mengklik Event Viewer -> Windows Logs -> Application . Anda dapat melihat apa yang membuat pengecualian di sini, yang mungkin membantu, tetapi Anda tidak mendapatkan pelacakan tumpukan.
  2. Ekstrak logika program Anda ke dalam proyek kelas perpustakaan. Sekarang buat dua versi program yang berbeda: aplikasi konsol (untuk debugging), dan layanan windows. (Ini adalah sedikit upaya awal, tetapi menghemat banyak kecemasan dalam jangka panjang.)
  3. Tambahkan lebih banyak blok percobaan / tangkap dan masuk ke aplikasi untuk mendapatkan gambaran yang lebih baik tentang apa yang terjadi.
McGarnagle
sumber
10
Windows Event Viewer menunjukkan jejak tumpukan lengkap, alat yang sangat membantu.
Talha Imam
37

Tidak yakin ini akan membantu, tetapi untuk men-debug layanan, Anda selalu dapat menggunakan yang berikut ini dalam metode OnStart:

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

daripada Anda bisa melampirkan studio visual Anda ke proses dan memiliki kemampuan debug yang lebih baik.

semoga bermanfaat, semoga berhasil

Eyal H.
sumber
Sejauh ini, ini adalah solusi terbaik (setidaknya untuk saya). VS 2015 menangani ini dengan baik juga. Bagi saya itu muncul dialog konfirmasi UAC untuk debugger JIT dan kemudian biarkan saya memilih VS 2015 sebagai debugger.
Smitty
9

Saya merasa sangat berguna untuk mengubah layanan windows yang ada ke konsol hanya dengan mengubah program Anda dengan yang berikut ini. Dengan perubahan ini Anda dapat menjalankan program dengan debugging di visual studio atau menjalankan executable secara normal. Tetapi itu juga akan berfungsi sebagai layanan windows. Saya juga membuat posting blog tentang itu

program.cs

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

PROGRAM_Anda

[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
    }
}
Ben Anderson
sumber
2

EventLog.Log harus disetel sebagai "Aplikasi"

panini pitke
sumber
Saya baru saja memberi suara positif karena ini sebenarnya adalah solusi untuk masalah saya
Savage
1

Sementara itu, alasan lain: file .config terhapus secara tidak sengaja menyebabkan munculnya pesan error yang sama:

"Layanan di komputer lokal dimulai dan kemudian dihentikan. Beberapa layanan berhenti secara otomatis ..."

Emre Guldogan
sumber
0

Gunakan Timer dan centang acara untuk menyalin file Anda.

Saat memulai layanan, mulai waktu dan tentukan interval waktu.

Jadi layanan tetap berjalan dan salin file ontick.

Semoga membantu.

Sethu
sumber
0

Anda mungkin ingin menguji unit inisialisasi - tetapi karena inisialisasi itu ada di OnStart metode ini hampir tidak mungkin. Saya akan menyarankan memindahkan kode inisialisasi ke kelas terpisah sehingga dapat diuji atau setidaknya digunakan kembali dalam penguji formulir.

Kedua, menambahkan beberapa logging (menggunakan Log4Net atau serupa) dan menambahkan beberapa logging panjang sehingga Anda dapat melihat detail tentang error runtime. Contoh error runtime AccessViolationdsb. Terutama jika layanan Anda berjalan tanpa cukup hak untuk mengakses file konfigurasi.

Quinton Bernhardt
sumber
0

Akun yang menjalankan layanan mungkin tidak memetakan D: -drive (khusus pengguna). Coba bagikan direktori, dan gunakan jalur UNC lengkap di backupConfig.

Anda watchertipe FileSystemWatcheradalah variabel lokal, dan keluar dari ruang lingkup ketika OnStartmetode dilakukan. Anda mungkin membutuhkannya sebagai instance atau variabel kelas.

Alf Kåre Lefdal
sumber
0

Saya menemukan masalah yang sama. Layanan saya mengupload / menerima XMLS dan menulis kesalahan ke Event Log.

Saat saya membuka Log Peristiwa, saya mencoba memfilternya. Ini mengingatkan saya bahwa Log Peristiwa rusak.

Saya membersihkan Log Peristiwa dan semua OK.

PanosPlat
sumber
0

Dalam kasus kami, tidak ada yang ditambahkan di Windows Event Logs kecuali log bahwa layanan bermasalah telah dimulai dan kemudian dihentikan.

Ternyata file CONFIG layanan tidak valid. Memperbaiki file CONFIG yang tidak valid memperbaiki masalah.

rikitikitik
sumber