Dịch vụ Windows trên Máy tính cục bộ bắt đầu và sau đó dừng lại lỗi


104

Thông thường, tôi gặp lỗi này: (Dịch vụ "tên dịch vụ" trên Máy tính cục bộ khởi động và sau đó dừng lại. Một số dịch vụ tự động dừng nếu chúng không được dịch vụ hoặc chương trình khác sử dụng) khi có điều gì đó sai với mã của tôi, chẳng hạn như không tồn tại đường dẫn ổ đĩa, v.v. Dịch vụ windows sẽ không khởi động.

Tôi có dịch vụ windows sao lưu thư mục / tệp vào một vị trí nếu nó đạt đến giới hạn kích thước. Tất cả các chi tiết đều được cung cấp bởi Cấu hình XML mà dịch vụ windows đọc khi bắt đầu. Tôi có một biểu mẫu cửa sổ riêng có một nút thực hiện chính xác những gì mà chương trình cửa sổ của dịch vụ cửa sổ của tôi đang làm. Tôi sử dụng các biểu mẫu windows của mình để gỡ lỗi mã trước khi đưa nó vào dịch vụ windows của mình.

Khi tôi bắt đầu các biểu mẫu cửa sổ của mình. Nó làm những gì nó cho là phải làm. Khi tôi đặt mã của mình vào phương thức OnStart () của dịch vụ windows, lỗi đã xuất hiện.

Đây là mã của tôi:

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

Tôi không biết điều gì khiến dịch vụ cửa sổ không khởi động, trình mô phỏng biểu mẫu cửa sổ hoạt động tốt. Hình như có vấn đề gì thì phải?

CẬP NHẬT: Sau nhiều lần dùng thử, tôi nhận thấy rằng chỉ sử dụng một thư mục thư mục (tệp w / out), dịch vụ windows không hoạt động. Khi tôi thay thế biến fileWatch bằng một tệp cụ thể (bao gồm cả thư mục của nó), dịch vụ windows bắt đầu. Khi tôi thay đổi nó trở lại vị trí thư mục, nó không hoạt động. Điều tôi nghĩ là các vị trí thư mục không hoạt động trong trình xem tệp.

Khi tôi thử tạo một dịch vụ windows mới theo dõi vị trí thư mục, nó đã hoạt động .. Tuy nhiên, khi tôi thử cùng một vị trí trong dịch vụ windows ban đầu của mình, nó không hoạt động! Tôi đã nghĩ đến $ # * ed! Có vẻ như tôi phải tạo một dịch vụ windows mới và xây dựng trình cài đặt mỗi khi tôi đặt mã / chức năng mới .. Bằng cách này, tôi có thể theo dõi vị trí gặp lỗi.

Câu trả lời:


202

Nếu dịch vụ bắt đầu và dừng như vậy, điều đó có nghĩa là mã của bạn đang ném một ngoại lệ chưa được xử lý. Điều này khá khó để gỡ lỗi, nhưng có một số tùy chọn.

  1. Tham khảo ý kiến ​​của Windows Event Viewer . Thông thường, bạn có thể thực hiện điều này bằng cách đi tới trình quản lý máy tính / máy chủ, sau đó nhấp vào Trình xem sự kiện -> Nhật ký Windows -> Ứng dụng . Bạn có thể xem điều gì đã tạo ra ngoại lệ ở đây, điều này có thể hữu ích, nhưng bạn không nhận được dấu vết ngăn xếp.
  2. Trích xuất logic chương trình của bạn thành một dự án lớp thư viện. Bây giờ hãy tạo hai phiên bản khác nhau của chương trình: ứng dụng console (để gỡ lỗi) và dịch vụ windows. (Đây là một chút nỗ lực ban đầu, nhưng tiết kiệm rất nhiều chi phí trong thời gian dài.)
  3. Thêm nhiều khối thử / bắt và đăng nhập vào ứng dụng để có bức tranh rõ hơn về những gì đang diễn ra.

10
Windows Event Viewer đã hiển thị toàn bộ dấu vết ngăn xếp, một công cụ rất hữu ích.
Talha Imam

37

Không chắc điều này sẽ hữu ích, nhưng để gỡ lỗi một dịch vụ, bạn luôn có thể sử dụng cách sau trong phương pháp OnStart:

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

bạn có thể đính kèm studio trực quan của mình vào quy trình và có khả năng gỡ lỗi tốt hơn.

hy vọng điều này là hữu ích, chúc may mắn


Đây là giải pháp tốt nhất cho đến nay (ít nhất là đối với tôi). VS 2015 xử lý điều này rất tốt. Đối với tôi, nó xuất hiện một hộp thoại xác nhận UAC cho trình gỡ lỗi JIT và sau đó để tôi chọn VS 2015 làm trình gỡ lỗi.
Smitty

9

Tôi thấy rất tiện lợi khi chuyển đổi dịch vụ windows hiện có của bạn sang bảng điều khiển bằng cách chỉ cần thay đổi chương trình của bạn bằng cách sau. Với thay đổi này, bạn có thể chạy chương trình bằng cách gỡ lỗi trong studio trực quan hoặc chạy tệp thực thi bình thường. Nhưng nó cũng sẽ hoạt động như một dịch vụ windows. Tôi cũng đã tạo một bài đăng trên blog về nó

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 phải được đặt là "Ứng dụng"


Tôi vừa ủng hộ vì đây thực sự là giải pháp cho vấn đề đối với tôi
Savage

1

Trong khi đó, một lý do khác: vô tình xóa tệp .config gây ra thông báo lỗi tương tự xuất hiện:

"Dịch vụ trên máy tính cục bộ bắt đầu và sau đó dừng lại. Một số dịch vụ tự động dừng ..."


0

Sử dụng Hẹn giờ và đánh dấu sự kiện để sao chép tệp của bạn.

Khi bắt đầu dịch vụ, bắt đầu thời gian và chỉ định khoảng thời gian.

Vì vậy, dịch vụ vẫn tiếp tục chạy và sao chép các tệp tin.

Hy vọng nó sẽ giúp.


0

Bạn có thể muốn kiểm tra đơn vị khởi tạo - nhưng vì nó nằm trong OnStartphương pháp này nên gần như không thể. Tôi khuyên bạn nên chuyển mã khởi tạo ra một lớp riêng biệt để nó có thể được kiểm tra hoặc ít nhất là được sử dụng lại trong trình kiểm tra biểu mẫu.

Thứ hai, thêm một số ghi nhật ký (sử dụng Log4Net hoặc tương tự) và thêm một số ghi nhật ký dài dòng để bạn có thể xem chi tiết về lỗi thời gian chạy. Ví dụ về lỗi thời gian chạy sẽ là, AccessViolationv.v. đặc biệt nếu dịch vụ của bạn đang chạy mà không có đủ đặc quyền để truy cập các tệp cấu hình.


0

Tài khoản đang chạy dịch vụ có thể không ánh xạ D: -drive (chúng dành riêng cho người dùng). Hãy thử chia sẻ thư mục và sử dụng đường dẫn UNC đầy đủ trong của bạn backupConfig.

watcherKiểu của bạn FileSystemWatcherlà một biến cục bộ và nằm ngoài phạm vi khi OnStartphương thức được thực hiện. Bạn có thể cần nó như một biến thể hiện hoặc biến lớp.


0

Tôi đã gặp vấn đề tương tự. Dịch vụ của tôi đang tải lên / nhận XMLS và ghi lỗi vào Nhật ký sự kiện.

Khi tôi truy cập Nhật ký sự kiện, tôi đã cố gắng lọc nó. Nó nhắc tôi rằng Nhật ký sự kiện đã bị hỏng.

Tôi đã xóa Nhật ký sự kiện và tất cả đều OK.


0

Trong trường hợp của chúng tôi, không có gì được thêm vào Nhật ký sự kiện Windows ngoại trừ nhật ký mà dịch vụ có vấn đề đã được khởi động và sau đó dừng lại.

Hóa ra là tệp CONFIG của dịch vụ không hợp lệ. Sửa tệp CONFIG không hợp lệ đã khắc phục sự cố.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.