用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 就可以了。