【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录

一、前言

二、效果图

三、配置文件

四、代码

五、一键启动/停止所有服务


一、前言

使用C#窗体应用开启Apache、MySQL服务,不仅仅是Apache、MySQL,其他服务也可以使用同样的方法操作,包括开启自己写的脚本服务。

二、效果图

两种状态:

① 开启Apache:点击启动按钮,开启apache,同时服务状态切换为运行中

② 停止apache:点击停止按钮,停止apache,同时服务状态切换为已停止

三、配置文件

用于存储需要操作的服务的路径和服务命,要根据实际情况修改,存放在”\bin\Debug\“目录下,命名为app.ini

[section]
apache=httpd
mysql=mysqld
python=StartService.vbs
python2=Python
apache_path=E:\phpstudy_pro\Extensions\Apache2.4.39\bin\httpd.exe
mysql_path=E:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqld.exe
python_path=E:\Pyhton\flow\

四、代码

这里只展示开启和关闭Apache服务的代码,其他服务操作的代码一样就不再展示了,只需要把服务名和服务所在路径替换就可以了。

业务逻辑:

需要先读取配置文件app.ini文件里的内容,

① 开启服务:获取到apache的路径,构建启动信息,开始启动apache服务。

② 关闭服务:先获取apache的服务名(注意是服务名,不是路径),再查找名为apache的进程,找到后关闭该服务(为了确保确实关闭了,在2秒后使用Kill()强制关闭)。

读取配置文件的参数及用法可以看这篇文章

【C#】读取ini配置文件的内容_c#读取ini配置文件-****博客

//配置文件路径
private string iniFilePath = Directory.GetCurrentDirectory() + "\\app.ini";

#region API函数声明
[DllImport("kernel32")]//返回取得字符串缓冲区的长度
private static extern long GetPrivateProfileString(string section, string key,
	string def, StringBuilder retVal, int size, string filePath);

#endregion

#region 读Ini文件

public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath)
{
	if (File.Exists(iniFilePath))
	{
		StringBuilder temp = new StringBuilder(1024);
		GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);
		return temp.ToString();
	}
	else
	{
		return String.Empty;
	}
}



// 开启apache服务
private void apache_start_Click(object sender, EventArgs e)
{
	string apache_path = ReadIniData("section", "apache_path", "NoText", iniFilePath);
	string StartScript = @apache_path;

	// 构建启动信息
	ProcessStartInfo startInfo = new ProcessStartInfo
	{
		FileName = StartScript,
		CreateNoWindow = true, // 不创建窗口
		UseShellExecute = false, // 不使用系统外壳程序启动
		WindowStyle = ProcessWindowStyle.Hidden // 隐藏窗口
	};

	// 启动Apache
	using (Process apacheProcess = Process.Start(startInfo))
	{

		// 你可以在这里监控进程,或等待它结束
		apache_status.Text = "运行中";
		apache_status.ForeColor = System.Drawing.Color.Green;

	}
}
// 停止apache服务
private void apache_stop_Click(object sender, EventArgs e)
{
	string apache = ReadIniData("section", "apache", "NoText", iniFilePath);

	try
	{
		// 获取所有名为 "apache" 的进程  
		Process[] processes = Process.GetProcessesByName(apache);

		foreach (Process process in processes)
		{
			try
			{
				// 尝试优雅地关闭进程(如果可能的话)  
				// 注意:apache可能没有主窗口,因此CloseMainWindow可能不起作用  
				process.CloseMainWindow();

				// 等待一段时间看进程是否关闭  
				if (!process.WaitForExit(2000)) // 等待5秒  
				{
					// 如果进程没有关闭,则强制结束它  
					process.Kill();
				}
				apache_status.Text = "已停止";
				apache_status.ForeColor = System.Drawing.Color.Crimson;
			}
			catch (Exception ex)
			{
				// 处理任何异常,比如权限不足等 
				MessageBox.Show("Error closing process: " + ex.Message);
			}
		}

		MessageBox.Show("Apache services have been closed.");
	}
	catch (Exception ex)
	{
		// 处理获取进程列表时的任何异常  
		MessageBox.Show("Error getting process list: " + ex.Message);
	}
}

五、一键启动/停止所有服务

一键启动/关闭所有服务代码就不再展示,其原理是把需要开启的服务放到同一个点击事件里,比如说一键开启Apache、MySQL服务,只需要把开启Apache的代码和开启MySQL服务的代码放到同一个点击事件里就可以了。一键停止所有服务也是同样的道理,就不再贴代码了。

上一篇:【软考高项】十三、信息系统工程之软件工程


下一篇:量子计算+运营优化!IonQ 和 德国DESY 合作提升机场登机口调度效率