Powershell 监控应用线程数,强制重启,发送消息通知
系统中一个Windows服务应用,隔几个小时线程数会升到很高导致问题。为了给找出问题争取时间,写了这个脚本,临时解决一下问题。
功能很简单:
- 定时报告线程数
- 线程数超过设定,杀掉进程,重新启动,并发送telegram消息
注意:如果是不可以直接杀掉进程的应用,不能这样。
$jobname="ThirdPartyGameInterfaceServiceMinor" #计划名称
$maxThreadCount =[int]400 #重启线程数
$telegramURL =[string]"https://api.telegram.org"
$envName="测试环境" #环境名称
#如果计划存在,删掉。后面重建
$taskExists = Get-ScheduledTask | Where-Object {$_.TaskName -in $jobname }
if($taskExists){
#删除计划
Get-ScheduledJob -Name $jobname | Unregister-ScheduledJob
}
#添加计划工作
$job=Register-ScheduledJob -Name $jobname -ScriptBlock {
$appname="ThirdPartyGame.InterfaceService" #进程名
$process1=Get-Process $appname
$count=$process1.Threads.Count
$ip=[System.Net.DNS]::GetHostByName($null).AddressList.IPAddressToString
if($count -gt $maxThreadCount){
echo "准备强制重启,现在线程:" $count
taskkill /f /pid $process1.Id #强制结束进程
echo "kill end.Try Start now"
Start-Sleep -s 5 #休眠5秒后启动服务
Start-Service $appname #启动服务
#发送telegram通知消息.telegram的key乱填的
Invoke-WebRequest ([string]::Concat( $telegramURL,"/bot6xxxxxx2:AAEG_WgRxxxxxxxxxxx8qz8XnY/sendMessage?chat_id=-309696116&text=准备强制重启,现在线程:", $count,"。 ip:",$ip,"。环境:",$envName))
}
else{
Invoke-WebRequest ([string]::Concat( $telegramURL,"/bot6xxxxxx2:AAEG_WgRxxxxxxxxxxx8qz8XnY/sendMessage?chat_id=-309696116&text=现在线程:", $count,"。ip:",$ip,"。环境:",$envName))
}
}
#创建工作触发器。1小时一次
$jobt=New-JobTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -hour 1) -RepetitionDuration ([TimeSpan]::MaxValue)
#给计划工作添加触发器
$job | Add-JobTrigger -Trigger $jobt
#禁用计划
# $job | Disable-ScheduledJob
#启用计划
$job | Enable-ScheduledJob
"输入任意键退出" ;
[Console]::Readkey() | Out-Null ;
Exit ;