บริการ Windows บน Local Computer เริ่มทำงานแล้วหยุดข้อผิดพลาด


105

โดยปกติฉันจะได้รับข้อผิดพลาดนี้: (บริการ "ชื่อบริการ" บน Local Computer เริ่มทำงานแล้วหยุดบริการบางอย่างจะหยุดโดยอัตโนมัติหากไม่ได้ใช้งานโดยบริการหรือโปรแกรมอื่น) เมื่อมีบางอย่างผิดปกติกับรหัสของฉันเช่นไม่มีอยู่ เส้นทางการขับรถ ฯลฯ บริการ windows จะไม่เริ่มทำงาน

ฉันมีบริการ windows ที่สำรองโฟลเดอร์ / ไฟล์ไปยังตำแหน่งที่ตั้งถ้ามันถึงขนาด จำกัด รายละเอียดทั้งหมดมีให้โดยการกำหนดค่า XML ที่บริการ windows อ่านเมื่อเริ่มต้น ฉันมีรูปแบบหน้าต่างแยกต่างหากที่มีปุ่มที่ทำสิ่งที่บริการ 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 ไม่ทำงาน เมื่อฉันแทนที่ตัวแปร fileWatch ด้วยไฟล์เฉพาะ (รวมถึงไดเร็กทอรี) บริการ windows จะเริ่มทำงาน เมื่อฉันเปลี่ยนกลับไปที่ตำแหน่งโฟลเดอร์ก็ไม่ได้ผล สิ่งที่ฉันคิดคือตำแหน่งโฟลเดอร์ไม่ทำงานใน filewatcher

เมื่อฉันพยายามสร้างบริการ windows ใหม่ที่เฝ้าดูตำแหน่งโฟลเดอร์มันใช้งานได้ .. อย่างไรก็ตามเมื่อฉันลองใช้ตำแหน่งเดิมในบริการ windows เดิมของฉันมันไม่ได้ผล! ฉันคิดว่า $ # * ed! ดูเหมือนว่าฉันต้องสร้างบริการ windows ใหม่และสร้างโปรแกรมติดตั้งทุกครั้งที่ฉันวางโค้ด / ฟังก์ชันใหม่ .. วิธีนี้ทำให้ฉันสามารถติดตามได้ว่าฉันพบข้อผิดพลาดที่ใด

คำตอบ:


204

หากบริการเริ่มต้นและหยุดลงเช่นนั้นแสดงว่ารหัสของคุณมีข้อยกเว้นที่ไม่สามารถจัดการได้ การแก้จุดบกพร่องค่อนข้างยาก แต่มีไม่กี่ตัวเลือก

  1. ที่ปรึกษาของ Windows Event Viewer ปกติคุณจะได้รับโดยไปที่ผู้จัดการ / คอมพิวเตอร์เซิร์ฟเวอร์จากนั้นคลิกแสดงเหตุการณ์ -> แฟ้มบันทึกของ Windows -> แอพลิเคชัน คุณสามารถดูสิ่งที่ทำให้เกิดข้อยกเว้นได้ที่นี่ซึ่งอาจช่วยได้ แต่คุณไม่ได้รับการติดตามสแต็ก
  2. แยกตรรกะโปรแกรมของคุณลงในโปรเจ็กต์คลาสไลบรารี ตอนนี้สร้างโปรแกรมสองเวอร์ชันที่แตกต่างกัน: แอปคอนโซล (สำหรับการดีบัก) และบริการ windows (นี่เป็นความพยายามเล็กน้อย แต่ช่วยประหยัดความทุกข์ได้มากในระยะยาว)
  3. เพิ่มบล็อก try / catch เพิ่มเติมและเข้าสู่ระบบแอพเพื่อให้ได้ภาพที่ดีขึ้นว่าเกิดอะไรขึ้น

11
Windows Event Viewer แสดงการติดตามสแต็กที่สมบูรณ์ซึ่งเป็นเครื่องมือที่มีประโยชน์มาก
Talha Imam

37

ไม่แน่ใจว่าสิ่งนี้จะเป็นประโยชน์ แต่สำหรับการดีบักบริการคุณสามารถใช้สิ่งต่อไปนี้ในวิธี OnStart:

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

มากกว่าที่คุณจะแนบสตูดิโอภาพเข้ากับกระบวนการและมีความสามารถในการดีบักที่ดีกว่า

หวังว่านี่จะเป็นประโยชน์โชคดี


นี่เป็นทางออกที่ดีที่สุด (อย่างน้อยสำหรับฉัน) VS 2015 จัดการเรื่องนี้ได้ดีเช่นกัน สำหรับฉันมันปรากฏกล่องโต้ตอบการยืนยัน UAC สำหรับดีบักเกอร์ JIT จากนั้นให้ฉันเลือก VS 2015 เป็นดีบักเกอร์
Smitty

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

ใช้ตัวจับเวลาและทำเครื่องหมายที่เหตุการณ์เพื่อคัดลอกไฟล์ของคุณ

ในการเริ่มบริการให้เริ่มเวลาและระบุช่วงเวลาในเวลา

ดังนั้นบริการจึงทำงานต่อไปและคัดลอกไฟล์ ontick

หวังว่ามันจะช่วยได้


0

คุณอาจต้องการทดสอบหน่วยการเริ่มต้น - แต่เนื่องจากเป็นOnStartวิธีการนี้จึงใกล้จะเป็นไปไม่ได้ ฉันขอแนะนำให้ย้ายรหัสเริ่มต้นออกเป็นคลาสแยกต่างหากเพื่อให้สามารถทดสอบหรืออย่างน้อยก็ใช้ซ้ำในเครื่องทดสอบแบบฟอร์ม

ประการที่สองให้เพิ่มการบันทึก (โดยใช้Log4Netหรือที่คล้ายกัน) และเพิ่มการบันทึกแบบละเอียดเพื่อให้คุณสามารถดูรายละเอียดเกี่ยวกับข้อผิดพลาดรันไทม์ ตัวอย่างของข้อผิดพลาดรันไทม์จะAccessViolationเป็นต้นโดยเฉพาะอย่างยิ่งหากบริการของคุณทำงานโดยไม่มีสิทธิ์เพียงพอในการเข้าถึงไฟล์กำหนดค่า


0

บัญชีที่ใช้บริการอาจไม่ได้แมป D: -drive (เป็นบัญชีเฉพาะผู้ใช้) ลองแชร์ไดเร็กทอรีและใช้ UNC-path แบบเต็มในbackupConfigไฟล์.

watcherประเภทของคุณFileSystemWatcherเป็นตัวแปรภายในและอยู่นอกขอบเขตเมื่อทำOnStartวิธีการเสร็จสิ้น คุณอาจต้องการเป็นตัวแปรอินสแตนซ์หรือคลาส


0

ฉันเจอปัญหาเดียวกัน บริการของฉันกำลังอัปโหลด / รับ XMLS และเขียนข้อผิดพลาดลงในบันทึกเหตุการณ์

เมื่อฉันไปที่บันทึกเหตุการณ์ฉันพยายามกรองมัน มันแจ้งให้ฉันทราบว่าบันทึกเหตุการณ์เสียหาย

ฉันล้างบันทึกเหตุการณ์และตกลงทั้งหมด


0

ในกรณีของเราไม่มีการเพิ่มสิ่งใดใน Windows Event Logs ยกเว้นบันทึกว่าบริการที่มีปัญหาได้เริ่มทำงานแล้วหยุดทำงาน

ปรากฎว่าไฟล์ CONFIG ของบริการไม่ถูกต้อง การแก้ไขไฟล์ CONFIG ที่ไม่ถูกต้องช่วยแก้ปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.