137 lines
4.8 KiB
PowerShell
137 lines
4.8 KiB
PowerShell
|
|
# 批量启动边缘节点并在停止时清理所有进程
|
|||
|
|
# 每秒启动100个节点,最多启动10000个
|
|||
|
|
|
|||
|
|
# 存储所有进程ID的数组
|
|||
|
|
$processes = @()
|
|||
|
|
# 计数器
|
|||
|
|
$nodeCounter = 0
|
|||
|
|
# 最大节点数
|
|||
|
|
$maxNodes = 1000
|
|||
|
|
# 每批次启动的节点数
|
|||
|
|
$batchSize = 100
|
|||
|
|
# API地址
|
|||
|
|
$onlineApi = "http://192.168.3.42:8080/api/edge/online"
|
|||
|
|
$offlineApi = "http://192.168.3.42:8080/api/edge/offline"
|
|||
|
|
# 节点可执行文件路径
|
|||
|
|
$edgeExePath = Join-Path -Path $PSScriptRoot -ChildPath "..\bin\proxy_edge_win_amd64.exe"
|
|||
|
|
|
|||
|
|
# 检查可执行文件是否存在
|
|||
|
|
if (-not (Test-Path -Path $edgeExePath)) {
|
|||
|
|
Write-Host "错误:找不到边缘节点可执行文件: $edgeExePath" -ForegroundColor Red
|
|||
|
|
Write-Host "请先运行 build-edge.ps1 构建可执行文件" -ForegroundColor Yellow
|
|||
|
|
exit 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 定义清理函数,终止所有进程
|
|||
|
|
function Cleanup {
|
|||
|
|
Write-Host "`n正在终止所有节点进程..." -ForegroundColor Yellow
|
|||
|
|
|
|||
|
|
# 计数器
|
|||
|
|
$killedCount = 0
|
|||
|
|
|
|||
|
|
foreach ($process in $processes) {
|
|||
|
|
try {
|
|||
|
|
$proc = Get-Process -Id $process -ErrorAction SilentlyContinue
|
|||
|
|
if ($proc) {
|
|||
|
|
Stop-Process -Id $process -ErrorAction SilentlyContinue
|
|||
|
|
$killedCount++
|
|||
|
|
|
|||
|
|
# 每终止100个进程显示一次进度
|
|||
|
|
if ($killedCount % 100 -eq 0) {
|
|||
|
|
Write-Host "已终止 $killedCount 个节点进程" -ForegroundColor Cyan
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch {
|
|||
|
|
# 忽略已终止的进程错误
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Write-Host "总共终止了 $killedCount 个节点进程" -ForegroundColor Green
|
|||
|
|
|
|||
|
|
# 最后确认清理
|
|||
|
|
$remainingProcs = Get-Process | Where-Object { $_.Path -eq $edgeExePath }
|
|||
|
|
if ($remainingProcs) {
|
|||
|
|
$remainingCount = $remainingProcs.Count
|
|||
|
|
Write-Host "尝试强制终止剩余的 $remainingCount 个节点进程..." -ForegroundColor Red
|
|||
|
|
$remainingProcs | Stop-Process -Force -ErrorAction SilentlyContinue
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Write-Host "清理完成!" -ForegroundColor Green
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 注册Ctrl+C事件处理
|
|||
|
|
$null = [Console]::CancelKeyPress.Connect({
|
|||
|
|
param($sender, $e)
|
|||
|
|
$e.Cancel = $true # 防止立即退出,让清理函数有时间执行
|
|||
|
|
Cleanup
|
|||
|
|
exit 0
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
# 显示启动信息
|
|||
|
|
Write-Host "开始批量启动边缘节点..." -ForegroundColor Green
|
|||
|
|
Write-Host "每秒将启动 $batchSize 个节点,最多启动 $maxNodes 个节点" -ForegroundColor Cyan
|
|||
|
|
Write-Host "按下 Ctrl+C 停止并清理所有节点" -ForegroundColor Yellow
|
|||
|
|
Write-Host "--------------------------------------------------" -ForegroundColor White
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
while ($nodeCounter -lt $maxNodes) {
|
|||
|
|
$batchStartTime = Get-Date
|
|||
|
|
$startedInBatch = 0
|
|||
|
|
|
|||
|
|
# 批量启动节点
|
|||
|
|
for ($i = 0; $i -lt $batchSize; $i++) {
|
|||
|
|
# 生成随机名称
|
|||
|
|
$randomName = "edge-" + [Guid]::NewGuid().ToString().Substring(0, 8)
|
|||
|
|
|
|||
|
|
# 启动进程
|
|||
|
|
$startInfo = New-Object System.Diagnostics.ProcessStartInfo
|
|||
|
|
$startInfo.FileName = $edgeExePath
|
|||
|
|
$startInfo.Arguments = "-n `"$randomName`" -online `"$onlineApi`" -offline `"$offlineApi`""
|
|||
|
|
$startInfo.UseShellExecute = $false
|
|||
|
|
$startInfo.CreateNoWindow = $true # 不显示命令行窗口
|
|||
|
|
|
|||
|
|
$process = [System.Diagnostics.Process]::Start($startInfo)
|
|||
|
|
$processes += $process.Id
|
|||
|
|
|
|||
|
|
$nodeCounter++
|
|||
|
|
$startedInBatch++
|
|||
|
|
|
|||
|
|
# 如果达到最大节点数,提前退出循环
|
|||
|
|
if ($nodeCounter -ge $maxNodes) {
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 计算本批次启动用时
|
|||
|
|
$batchDuration = (Get-Date) - $batchStartTime
|
|||
|
|
$batchTimeMs = $batchDuration.TotalMilliseconds
|
|||
|
|
|
|||
|
|
# 显示进度
|
|||
|
|
Write-Host "已启动 $nodeCounter 个节点 (本批次 $startedInBatch 个,耗时 $([math]::Round($batchTimeMs, 0)) ms)" -ForegroundColor Green
|
|||
|
|
|
|||
|
|
# 计算需要等待的时间以保持每秒启动指定数量节点
|
|||
|
|
$waitTimeMs = 1000 - $batchTimeMs
|
|||
|
|
if ($waitTimeMs -gt 0) {
|
|||
|
|
Start-Sleep -Milliseconds $waitTimeMs
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch {
|
|||
|
|
Write-Host "发生错误: $_" -ForegroundColor Red
|
|||
|
|
} finally {
|
|||
|
|
# 如果达到最大节点数,提示用户
|
|||
|
|
if ($nodeCounter -ge $maxNodes) {
|
|||
|
|
Write-Host "`n已达到最大节点数 $maxNodes!" -ForegroundColor Magenta
|
|||
|
|
Write-Host "按下 Ctrl+C 停止并清理所有节点" -ForegroundColor Yellow
|
|||
|
|
|
|||
|
|
# 保持脚本运行,等待用户手动终止
|
|||
|
|
try {
|
|||
|
|
while ($true) { Start-Sleep -Seconds 1 }
|
|||
|
|
} catch {
|
|||
|
|
# Ctrl+C被捕获时会进入这里
|
|||
|
|
Cleanup
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
# 脚本异常终止时执行清理
|
|||
|
|
Cleanup
|
|||
|
|
}
|
|||
|
|
}
|