C#检查服务状态,以及进行服务启停

1. linux环境

linux环境通过执行bash命令直接执行:

public string RunCmdLinux(string cmd)
        {
            var proc = new Process();
            System.Console.Write($"Run Linux cmd ==> [{cmd}]   START!");
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.FileName = "/bin/bash";
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.RedirectStandardError = true;
            proc.StartInfo.RedirectStandardInput = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.Start();
            proc.StandardInput.WriteLine(cmd);
            proc.StandardInput.WriteLine("exit");
            string outStr = proc.StandardOutput.ReadToEnd();
            proc.Close();
            System.Console.Write($"Run Linux cmd ==> [{cmd}]   FINISHED!");
            return outStr;
        }

2. window环境

windows使用 System.ServiceProcess依赖下的ServiceController进行操作,具体代码:

        /// <summary>
        /// 开启windows服务
        /// </summary>
        /// <param name="serviceName"></param>
        /// <returns></returns>

        public bool StartWindowsService(string serviceName)
        {
            bool isbn = false;
            try
            { 
                ServiceController star_service = new ServiceController(serviceName);
                if (star_service.Status != ServiceControllerStatus.Running &&
                star_service.Status != ServiceControllerStatus.StartPending)
                {
                    star_service.Start();

                    for (int i = 0; i < 60; i++)
                    {
                        star_service.Refresh();
                        System.Threading.Thread.Sleep(1000);
                        if (star_service.Status == ServiceControllerStatus.Running)
                        {
                            isbn = true;
                            break;
                        }
                        if (i == 59)
                        {
                            isbn = false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                System.Console.Write("[StartWindowsService] Error", ex);
                return false;
            }
            System.Console.Write($"[StartWindowsService]_serviceName:{serviceName},status:{isbn}");
            return isbn;
        }

        /// <summary>
        /// 关闭windows服务
        /// </summary>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public bool StopWindowsService(string serviceName)
        {
            bool isbn = false;
            try
            {
                ServiceController star_service = new ServiceController(serviceName);
                System.Console.WriteLine(star_service.Status);
                if (star_service.Status == ServiceControllerStatus.Running)
                {
                    star_service.Stop();
                }
                for (int i = 0; i < 60; i++)
                {
                    star_service.Refresh();
                    System.Threading.Thread.Sleep(1000);
                    if (star_service.Status == ServiceControllerStatus.Running)
                    {
                        isbn = true;
                        break;
                    }
                    if (i == 59)
                    {
                        isbn = false;
                    }
                }
            }
            catch (Exception ex)
            {
                System.Console.Write("[StopWindowsService] Error", ex);
                isbn = false;
            }
            System.Console.Write($"[StopWindowsService]_serviceName:{serviceName},status:{isbn}");
            return isbn;
        }

        /// <summary>
        /// 获取windows服务的状态
        /// </summary>
        /// <param name="serviceName">服务名</param>
        /// <returns>服务的状态</returns>
        public string CheckWindowsServiceStatus(string serviceName) {
            var services = ServiceController.GetServices();
            string serviceStatu = string.Empty;
            bool isServiceExist = false;
            foreach (var s in services)
            {
                if (s.ServiceName.ToLower().Equals(serviceName.ToLower()))
                {
                    System.Console.Write($"[CheckWindowsServiceStatus] serviceName:{serviceName},serviceStatus:{s.Status}");
                    isServiceExist = true;
                    serviceStatu = s.Status.ToString();
                    break;
                }
            }

            if (!isServiceExist)
            {
                System.Console.Write($"[CheckWindowsServiceStatus] serviceName:${serviceName} not instal");
                serviceStatu = "Service is not installed";
            }
            return serviceStatu;
        }

当服务不能停止时,还可根据服务名,通过进程进行杀死:

 /// <summary>
        /// 通过服务的名称查询进程号,进行杀死
        /// </summary>
        /// <param name="threadName">服务名称</param>
        /// <returns></returns>
        public void ThreadKillExitis(string threadName)
        { 
            Process[] processList = Process.GetProcesses();
            foreach (Process process in processList)
            {
                if (process.ProcessName.ToLower() == threadName.ToLower())
                {
                    process.Kill(); 
                }
            }
            System.Console.Write($"[ThreadKillExitis]_{threadName} 成功");
        }

权限配置:

由于windows环境运行需要获取系统权限,因此需要设置app.manifest内容。
首先右键项目->属性->安全性下勾选启用ClickOnce安全设置,会默认增加一个app.manifest文件。
在这里插入图片描述
打开后,将<requestedExecutionLevel level="asInvoker" uiAccess="false" />修改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

在这里插入图片描述
完成后,右键项目->属性->安全性下取消勾选启用ClickOnce安全设置

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值