首页 > 技术文章 > Powershell 监控应用线程数,强制重启,发送消息通知

-dawn 2020-03-03 16:28 原文

系统中一个Windows服务应用,隔几个小时线程数会升到很高导致问题。为了给找出问题争取时间,写了这个脚本,临时解决一下问题。

功能很简单:

  1. 定时报告线程数
  2. 线程数超过设定,杀掉进程,重新启动,并发送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 ;

推荐阅读