The Daily Reboot (with execution check)
To workaround memory leaks in its application, one of my customers had an old bad thing on its webservers: a scheduled perl script to reboot the servers each day which uses the ‘Win32::InitiateSystemShutdown’ function, like this:
‘Win32::InitiateSystemShutdown ("","Reboot MACHINE ",60,0,1);’
According to the documentation, the parameter ‘0’ setted in fourth position is the reason why sometimes the servers didn’t reboot and no one knows it…
Perl win32 quick reference
Shutsdown the specified MACHINE, notifying users with the supplied MESSAGE, within the specified TIMEOUT interval. Forces closing of all documents without prompting the user if FORCECLOSE is true, and reboots the machine if REBOOT is true.
Let’s improve it a little bit with powershell.
- First the ‘DailyReboot.ps1’ script
- Then, we need to check, every day too, if the reboot has occured, and send an alert email if not!
Here’s the ‘DailyRebootCheck.ps1’ script
<# .SYNOPSIS DailyReboot - Restarts the local computer daily (if daily scheduled!) .DESCRIPTION DailyReboot - Automation of a Daily Reboot Restarts the local computer daily (if daily scheduled!) and write a entry in the eventlog, for checking purpose. .NOTES File Name : DailyReboot.ps1 Author : Fabrice ZERROUKI - fabricezerrouki@hotmail.com .EXAMPLE PS D:\>DailyReboot.ps1 Restarts the local computer. Has to be scheduled to be 'daily'. #> Restart-Computer -Force $ScriptName=$MyInvocation.MyCommand.ToString() $LogName="System" $ScriptPath=$MyInvocation.MyCommand.Path $Username=$env:USERNAME New-EventLog -Source $ScriptName -LogName $LogName -ErrorAction SilentlyContinue $Message="Script: " + $ScriptPath + "`nScript User: " + $Username + "`nStarted: " + (Get-Date).toString() + "`n`nThe computer has been restarted successfully." Write-EventLog -LogName $LogName -Source $ScriptName -EventID "6005" -EntryType "Information" -Message $Message
Has to be scheduled, every day at 05h00 for example.
http://www.zerrouki.com/schedule-a-powershell-script-execution/
<# .SYNOPSIS DailyRebootCheck - Checks if the local computer rebooted today .DESCRIPTION DailyRebootCheck - Checks if the local computer rebooted today and send an alert email if not. .NOTES File Name : DailyRebootCheck.ps1 Author : Fabrice ZERROUKI - fabricezerrouki@hotmail.com .EXAMPLE PS D:\>DailyRebootCheck.ps1 Searches the System event log for the event written by the DailyReboot.ps1 script. Has to be scheduled to be 'daily'. #> $Today=(Get-Date).AddHours(-2) $check=Get-EventLog -logname System -Source "DailyReboot.ps1" -After $Today -ErrorAction SilentlyContinue if (!$check) { $MailTo="recipient@mail.com" $MailSubject="$env:computername - Daily reboot failed!" $MailFrom="sender@mail.com" $SmtpServer="mailserver.example.com" $MailBody=@" Today ($Today), the computer $env:comptername has <strong>not</strong> been able to restart. Please have a look at it. "@ Send-MailMessage -To $MailTo -Subject $MailSubject -From $MailFrom -SmtpServer $SmtpServer -Priority High -BodyAsHtml $MailBody Write-Host "Get-EventLog: No matches found" Write-Host "Email alert send to $MailTo" -ForegroundColor DarkGreen }
Has to be scheduled, every day at least a few minutes after the ‘DailyReboot.ps1’ script schedule execution.
http://www.zerrouki.com/schedule-a-powershell-script-execution/