You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

使用方式:

  1. 赋予执行权限:chmod +x chrome_cpu_monitor.sh
  2. 后台启动:./chrome_cpu_monitor.sh &
  3. 测试结束后停止:pkill -f chrome_cpu_monitor.sh
关键注意事项
  • 避免误杀:可通过Chrome启动参数(如--headless)过滤测试相关进程,修改筛选逻辑为ps aux | grep "chrome --headless"
  • 测试恢复:查杀Chrome后,需在测试代码中捕获WebDriver断开异常,重新初始化浏览器实例
  • 日志留存:无论是代码还是脚本,都要记录查杀动作的时间、进程ID和CPU使用率,方便后续排查高CPU根因

内容的提问来源于stack exchange,提问作者Kiril

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:35:26