用Powershell脚本保活Windows服务
餐饮店的 Windows Server 上的某几个关键服务总是无缘无故死掉,糊个脚本上去解决这个问题。
实现的思路是这样子的:
写一个脚本,每隔一段时间就去检查系统上指定的服务之状态是不是“正在运行”
如果不是正在运行的话,就启动这个服务
实现这个功能的ps1脚本代码如下:
# 指定需要定时检查的服务的名字
$serviceNames = @("svCPAppSvr", "svKcnPrint", "svPrePrint", "svRealUd", "ASANYs_canyin", "svCPDataPipe", "svGuard")
# 指定检查时间间隔,我选择了每60秒检查一次
$intervalSeconds = 60
# 因为启动Windows服务需要 Administrator 权限,所以运行之前要看看自己够不够格
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
# 如果不够格就退出
if (-not $isAdmin) {
Start-Process -FilePath "PowerShell.exe" -ArgumentList "-File $($MyInvocation.MyCommand.Path)" -Verb "RunAs"
exit
}
while ( $true ) {
$currentTime = Get-Date
foreach ($serviceName in $serviceNames) {
# 程序主要部分,查看服务当前的状态
$serviceStatus = (Get-Service -Name $serviceName).Status
if ($serviceStatus -eq "Running") {
} else {
Write-Host "The $serviceName service is not running. Starting service..."
Start-Service -Name $serviceName
}
}
$nextCheckTime = $currentTime.AddSeconds($intervalSeconds)
Write-Host "`r`n饮食通服务保活 请勿关闭"
Write-Host "Next check time: $($nextCheckTime.ToString('yyyy-MM-dd HH:mm:ss'))"
Start-Sleep -Seconds $intervalSeconds
}
然后将以上脚本设置为开机自动启动就ok。
还有一个小细节,不知怎么地,Windows好像是不能让Powershell脚本开机自动启动的。
因此需要曲线救国:整一个.cmd脚本,用这个.cmd脚本拉起ps1脚本,然后再将这个.cmd脚本设置为开机自动启动。
这个.cmd脚本的内容如下所示,注意将路径改成实际路径。
powershell D:\yst_keepalive\yst_keepalive.ps1
那么在这个目录下我们就有了
目录: D:\yst_keepalive
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2023/4/21 10:48 45 yst_keepalive.cmd
-a---- 2023/4/23 10:25 1106 yst_keepalive.ps1
最后把那个.cmd文件的快捷方式放在 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
就可以了。