目录
一、前言
二、效果图
三、配置文件
四、代码
五、一键启动/停止所有服务
一、前言
使用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配置文件-CSDN博客
//配置文件路径
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服务的代码放到同一个点击事件里就可以了。一键停止所有服务也是同样的道理,就不再贴代码了。