Privacy Info

Saturday, May 7, 2022

PowerShell Service Monitor



We have previously faced issue monitoring our windows service and websites. Whenever the service is down, functionality which is dependent on the service stops working. Continuously monitoring the services is difficult and not feasible. To solve this problem we came up with PowerShell script which will monitor the service, alerts when service is down and automatically restart the service. This blog post will explain you how you can create similar Service Monitor application which will make your work easier.

Create folder with below folder structure:

Logs Folder

It will have logs files after execution of PowerShell script

Settings.xml File

It will contain the configuration details of the PowerShell script 

ServiceMonitor.ps1 File

It will contain actual code for monitoring service


Code Snippets

Settings.xml

<?xml version="1.0"?>
<Settings>
	<SolrSettings>
		<SolrURL>https://localhost:8984/solr/#/</SolrURL>
		<SolrServiceName>Solr-Service</SolrServiceName>		
	</SolrSettings>				
	<EmailSettings>
		<ToEmail>"noreply@gmail.com"</ToEmail>
		<FromEmail>ServiceMonitor@gmail.com</FromEmail>
		<EmailSubject>Service is not working</EmailSubject>
		<SMTPServer>smpt.gmail.com</SMTPServer>
		<EmailPort>25</EmailPort>
	</EmailSettings>
	<LogSettings>
		<LogFileFolder>C:\User\Projects\Restart Service\Logs\</LogFileFolder>
	</LogSettings>	
</Settings>


ServiceMonitor.ps1

#Import settings from config file
$MyDir = Split-Path -Parent $MyInvocation.MyCommand.Path
[xml]$ConfigFile = Get-Content "$MyDir\Settings.xml"

#Email Configuration 
[string[]]$ToEmail = $ConfigFile.Settings.EmailSettings.ToEmail
$FromEmail = $ConfigFile.Settings.EmailSettings.FromEmail
$EmailSubject = $ConfigFile.Settings.EmailSettings.EmailSubject
$EmailSmtpServer = $ConfigFile.Settings.EmailSettings.SMTPServer
$EmailPort = $ConfigFile.Settings.EmailSettings.EmailPort
$ErrorEmailMessage = ""
$ExceptionErrorEmailMessage=""

#LogFile Details
$TodayDate = Get-Date -format "dd-MM-yyyy"
$LogFileFolder = $ConfigFile.Settings.LogSettings.LogFileFolder
$LogFileName = $LogFileFolder+"ServiceMonitor-"+$TodayDate+".txt"
$LogMessage = ""  

#Solr Details
$SolrURL = $ConfigFile.Settings.SolrSettings.SolrURL
$SolrServiceName = $ConfigFile.Settings.SolrSettings.SolrServiceName

try{    
    $LogMessage +="`nStart - $((Get-Date).ToString())"

    $HTTP_Request = [System.Net.WebRequest]::Create($SolrURL)

    $HTTP_Response = $HTTP_Request.GetResponse()

    $HTTP_Status = [int]$HTTP_Response.StatusCode
    
    if($HTTP_Status -eq 200) {
        Write-Host "Solr Site is working"
        $LogMessage +="Solr Site is working`n"
    }
    else
    {
	throw "Solr website Error Occured" 								 			
    }  

}
catch{
	Write-host "Solr Site is down Error Occured:  $_"
	$LogMessage +="Solr Site is down Error Occured: $_`n"    	       
                
        #Restart Service       
        Invoke-Command -ScriptBlock { Restart-Service -Name  $args }  -ArgumentList $SolrServiceName
        Write-Host "Service Restarted"
        $LogMessage +="Service Restarted`n"
               
        
        #Send Email
        $ErrorEmailMessage = "URL: "+$solrURL+"`nError Details:"+$_+"`nSolr site was down`nService Restared"
        Send-MailMessage -To $ToEmail -From $FromEmail  -Subject $EmailSubject  -Body $ErrorEmailMessage  -SmtpServer $EmailSmtpServer  -Port $EmailPort			       
        Write-Host "Email Sent"
        $LogMessage +="Email Sent`n"						 		
		       	
}
finally{
    # Closing Objects
    If ($HTTP_Response -eq $null) { } 
    Else { $HTTP_Response.Close() }
}  
     
$LogMessage +="End - $((Get-Date).ToString())"
Add-Content $LogFileName $LogMessage


Sample Log File





You can also deploy code on Task Scheduler and monitor your service continuously.

I hope you will find the blog useful 😃


No comments:

Post a Comment

Sitecore PowerShell Script - Remove item from Workflow

We came across scenario where we need to remove multiple items from workflow. If items would be less then there would not be any issue but i...