開啓的服務在一些意外的情況下會自動掛掉,這就需要一個守護進程來循環的檢查服務,在它掛掉的情況下,自動啓動它。
整個工程有3個文件,第一個conf.txt是配置文件,配置需要守護的進程,例如:
配置注意事項:
1.timeinterval是指每隔多少秒檢查一次
2.startpath中的路徑要用\\分隔
3.processname要和任務管理器中的進程名一樣(區分大小寫),去掉.exe
{
timeinterval:"10",
process:[
{processname:"sqlservr",startpath:"C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQLSERVER\\MSSQL\\Binn\\sqlservr.exe"},
{processname:"Ssms",startpath:"C:\\Program Files (x86)\\Microsoft SQL Server\\140\\Tools\\Binn\\ManagementStudio\\Ssms.exe"}
]
}
第二個是Powershell的腳本
$current_dir = Split-Path -Parent $MyInvocation.MyCommand.Definition; $log_file = "${current_dir}\monitor.log" # 腳本日誌最大爲10M $log_max_size = 10*1024*1024 $CONF = (Get-Content "${current_dir}\conf.txt") | ConvertFrom-Json $timeinterval=$CONF.timeinterval function proce(){ for($i=0;$i -lt $CONF.process.Length;$i++) { Checstart $CONF.process[$i].processname $CONF.process[$i].startpath }} function log($content) { $date = Get-Date -UFormat "%Y-%m-%d %H:%M:%S" Add-Content -Path $log_file -Value "$date : $content" $log_file_size = (Get-ChildItem $current_dir\monitor.log).Length if ( $log_file_size -gt $log_max_size) { if ( Test-Path $current_dir\monitor.log.bak ) { Remove-Item $current_dir\monitor.log.bak } Copy-Item $log_file $current_dir\monitor.log.bak Clear-Content $log_file } } function Checstart($process_name,$start_up_file) { Get-Process | findstr $process_name > $null if ( $? -eq "True" ) { log "process ${process_name} is running!" } else { log "process ${process_name} is not exist, now to start it." Start-Process -FilePath $start_up_file if ( $? -eq "True" ) { log "start ${process_name} succefully!" } else { log "start ${process_name} failed!" } } } while(1 -eq 1) { proce Start-Sleep -Seconds $timeinterval }
第三個是執行記錄的日誌(腳本跑起來後自動會創建)。
讓這個ps腳本排個Job開機啓動即可。
如果是installutil安裝的服務,要使用 start-service 服務名 啓動,
function Checstart($process_name,$start_up_file) { Get-Process | findstr $process_name > $null if ( $? -eq "True" ) { log "process ${process_name} is running!" } else { log "process ${process_name} is not exist, now to start it." Start-service $start_up_file if ( $? -eq "True" ) { log "start ${process_name} succefully!" } else { log "start ${process_name} failed!" } } }
配置文件中的processname,startpath都寫成服務名即可
{ timeinterval:"10", process:[ {processname:"sqlservr",startpath:"sqlservr"} ] }
缺陷:要是這個job的進程自己掛掉了,該如何防止這種情況呢?