基于C#+SpecFlow的多线程自动化测试CPU监控及高占用进程查杀问询
完全可以实现测试期间的CPU监控与高占用Chrome进程自动查杀,下面提供两种实操方案:
方案1:在C#测试代码中集成监控逻辑
适合将监控与测试流程深度绑定,精准针对当前测试会话的Chrome进程:
- 获取进程CPU占用:Linux系统下可通过调用
ps命令快速获取进程CPU使用率,或读取/proc/[pid]/stat文件计算更精准的数值 - 定时监控逻辑:启动后台线程,每隔固定时间(比如2秒)检查目标进程状态
- 查杀触发条件:当系统CPU整体达100%,或单个Chrome进程CPU占用超40%-50%时执行查杀
- SpecFlow集成:可在
[BeforeTestRun]钩子中启动监控线程,全程覆盖测试执行周期
示例代码片段:
using System; using System.Diagnostics; using System.Threading; public class CpuMonitor { private Thread _monitorThread; private bool _isRunning; private readonly int _chromeCpuThreshold = 45; // 可调整为40或50 private readonly int _systemCpuThreshold = 100; public void StartMonitoring() { _isRunning = true; _monitorThread = new Thread(CheckAndKillProcesses) { IsBackground = true }; _monitorThread.Start(); } public void StopMonitoring() { _isRunning = false; _monitorThread?.Join(); } private void CheckAndKillProcesses() { while (_isRunning) { // 检查系统整体CPU使用率 if (GetSystemCpuUsage() >= _systemCpuThreshold) { KillTargetChromeProcesses(); } else { // 逐个检查Chrome进程CPU占用 foreach (var proc in Process.GetProcessesByName("chrome")) { try { var cpuUsage = GetProcessCpuUsage(proc.Id); if (cpuUsage >= _chromeCpuThreshold) { proc.Kill(); Console.WriteLine($"[{DateTime.Now}] Killed Chrome PID {proc.Id} (CPU: {cpuUsage}%)"); } } catch (Exception) { // 忽略已退出的进程 } } } Thread.Sleep(2000); } } // 获取系统整体CPU使用率 private float GetSystemCpuUsage() { var psi = new ProcessStartInfo("top", "-bn1 | grep 'Cpu(s)'") { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; using var proc = Process.Start(psi); var output = proc.StandardOutput.ReadToEnd(); var cpuValue = output.Split(',')[0].Split(' ')[1].Replace("%", ""); return float.TryParse(cpuValue, out var cpu) ? cpu : 0; } // 获取单个进程CPU使用率 private float GetProcessCpuUsage(int pid) { var psi = new ProcessStartInfo("ps", $"-p {pid} -o %cpu --no-headers") { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; using var proc = Process.Start(psi); var cpuStr = proc.StandardOutput.ReadToEnd().Trim(); return float.TryParse(cpuStr, out var cpu) ? cpu : 0; } // 查杀所有符合条件的Chrome进程(系统CPU满负荷时用) private void KillTargetChromeProcesses() { var psi = new ProcessStartInfo("bash", $"-c \"ps aux | grep chrome | grep -v grep | awk '$3 > {_chromeCpuThreshold}' | awk '{{print $2}}' | xargs kill -9\"") { UseShellExecute = false, CreateNoWindow = true }; Process.Start(psi); Console.WriteLine($"[{DateTime.Now}] Killed high-CPU Chrome processes due to system CPU overload"); } } // 在SpecFlow钩子中启用监控 [Binding] public class TestHooks { private static CpuMonitor _monitor; [BeforeTestRun] public static void InitializeMonitor() { _monitor = new CpuMonitor(); _monitor.StartMonitoring(); } [AfterTestRun] public static void ShutdownMonitor() { _monitor?.StopMonitoring(); } }
方案2:Linux系统级Bash脚本监控
适合独立于测试代码,全局监控并查杀符合条件的Chrome进程,无需修改测试代码:
编写脚本chrome_cpu_monitor.sh,在测试启动前后台运行:
#!/bin/bash INTERVAL=2 CHROME_CPU_THRESHOLD=45 SYSTEM_CPU_THRESHOLD=100 while true; do # 获取系统CPU使用率 SYSTEM_CPU=$(top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | sed 's/%//') if (( $(echo "$SYSTEM_CPU >= $SYSTEM_CPU_THRESHOLD" | bc -l) )); then # 系统CPU满负荷时,查杀所有超阈值的Chrome进程 ps aux | grep chrome | grep -v grep | awk '$3 > '$CHROME_CPU_THRESHOLD'' | awk '{print $2}' | xargs kill -9 2>/dev/null echo "[$(date '+%Y-%m-%d %H:%M:%S')] Killed Chrome processes (system CPU overload: $SYSTEM_CPU%)" else # 逐个查杀超阈值的Chrome进程 ps aux | grep chrome | grep -v grep | awk '$3 > '$CHROME_CPU_THRESHOLD'' | awk '{print $2, $3}' | while read -r PID CPU; do kill -9 $PID echo "[$(date '+%Y-%m-%d %H:%M:%S')] Killed Chrome PID $PID (CPU: $CPU%)" done fi sleep $INTERVAL done
使用方式:
- 赋予执行权限:
chmod +x chrome_cpu_monitor.sh - 后台启动:
./chrome_cpu_monitor.sh & - 测试结束后停止:
pkill -f chrome_cpu_monitor.sh
关键注意事项
- 避免误杀:可通过Chrome启动参数(如
--headless)过滤测试相关进程,修改筛选逻辑为ps aux | grep "chrome --headless" - 测试恢复:查杀Chrome后,需在测试代码中捕获WebDriver断开异常,重新初始化浏览器实例
- 日志留存:无论是代码还是脚本,都要记录查杀动作的时间、进程ID和CPU使用率,方便后续排查高CPU根因
内容的提问来源于stack exchange,提问作者Kiril
相关产品推荐
相关产品推荐

