当前位置: 首页 > 知识库问答 >
问题:

本地计算机上的Windows服务启动后停止错误

施轶
2023-03-14

通常,我会遇到这样的错误:(本地计算机上的“服务名称”服务启动然后停止。如果其他服务或程序未使用某些服务,则会自动停止)当我的代码出现错误时,例如不存在的驱动器路径等。windows服务将不会启动。

我有一个Windows服务,如果文件夹/文件达到大小限制,它可以备份到某个位置。详细信息都由Windows服务在启动时读取的XML配置提供。我有一个单独的Windows表单,其中有一个按钮,它完全执行我的Windows服务的onstart正在执行的操作。在将代码放入Windows服务之前,我使用我的Windows表单来调试代码。

当我启动我的windows表单时。它做了它应该做的事情。当我将我的代码放在windows service 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服务中尝试相同的位置时,它不起作用!我是mindf$#*ed!似乎每次我放置新代码/函数时,我都必须创建一个新的windows服务并构建安装程序。。这样我就可以跟踪哪里出错了。

共有3个答案

隗瑞
2023-03-14

我发现通过简单地更改程序将现有的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
    }
}
连昊天
2023-03-14

不确定这是否有用,但对于调试服务,您可以在OnStart方法中始终使用以下内容:

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

这样,您就可以将visual studio连接到进程并具有更好的调试能力。

希望这有帮助,祝你好运

温举
2023-03-14

如果服务像这样启动和停止,则意味着您的代码正在引发未经处理的异常。这很难调试,但有几个选项。

  1. 请参阅Windows事件查看器。通常,您可以通过转到计算机/服务器管理器,然后单击事件查看器来实现这一点-
 类似资料:
  • 本地计算机上的MySQL服务启动后停止。如果其他服务或程序不使用某些服务,它们会自动停止。 谁能解决这个问题?谢谢

  • 我已经用WinRun4J创建了一个windows服务。应用程序已成功安装为服务。但是,当我尝试在命令提示符下使用run

  • 本文向大家介绍sql2005 本地计算机上的SQL SERVER服务启动后又停止了解决方法,包括了sql2005 本地计算机上的SQL SERVER服务启动后又停止了解决方法的使用技巧和注意事项,需要的朋友参考一下     本方法主要是解决SQL Server运行过程中出现的“本地计算机上的MSSQLSERVER服务启动后又停止了。一些服务自动停止,如果它们没有什么可做的”解决方法。     笔者

  • 我已经从以下网站下载了“jenkins-1.501.zip”http://jenkins-ci.org/content/thank-you-downloading-windows-installer . 我已经解压缩了zip文件并成功地在Windows7上安装了Jenkins。詹金斯在好的。我想从控制台停止Jenkins服务。我该怎么做?通过控制台/命令行启动和重新启动的方式是什么?

  • 问题内容: 我已经从http://jenkins-ci.org/content/thank-you-downloading-windows- installer 下载了“ jenkins-1.501.zip” 。 我已经解压缩了zip文件,并在Windows 7上成功安装了Jenkins。詹金斯的表现不错。我想从控制台停止Jenkins服务。我怎样才能做到这一点?通过控制台/命令行启动和重新启动的

  • 启动Windows服务时不断遇到此错误消息。 本地计算机上的服务启动后停止。如果其他服务和程序不使用某些服务,它们会自动停止。 我的代码: