Рестарт IIS + PowerShell + Task Scheduler. Связка весьма замечательная, особенно, когда в случае неудачного запуска высылается письмо на почту. В этой статье мы с вами научимся перезапускать Internet Information Service.
Рестарт IIS через PowerShell
Вопрос главный, но не единственный: зачем ребутать iis? А затем, что иногда в веб-приложениях появляются ошибки, которые правятся только ребутом IIS-a. Конечно, еще некоторые изменения веб-конфигов могут потребовать перезапуска. Но в моей практике возникали именно ошибки, которые решались путем перезапуска. Я решил пойти простым способом, воспользовавшись командой iisreset, но далее я подумал: «А что если iis не запустится? Как я об этом узнаю?» сразу же я пришел к тому, что необходимо делать проверку.
Так как PowerShell не возвращает результат выполнения скрипта, то есть неизвестно с ошибками он выполнился или без, нужен был какой-то критерий, по которому можно отслеживать успешный результат. В итоге я решил ссылаться на одну единственную фразу, которая имеете в ряде строк при успешном перезапуске IIS — Internet services successfully restarted. Соответственно, мне необходимо реализовать проверку и в случае отрицательного результата, я решил воспользоваться способом оповещения через письмо, который описал в этой статье. Плюс ко всему, если понадобится скалировать скрипт на несколько серверов, я бы хотел знать, на котором возникла проблема. Приступим к реализации:
Первым делом получим имя сервера:
$server = hostname
Далее вобьем в переменную команду перезапуска IIS:
$iisr = iisreset
После чего, добавим переменную, которая будет в себе содержать искомое значение:
$equals = «Internet services successfully restarted»
Отлично, теперь необходимо добавить проверку. Мы знаем, что в одной из четырех строк, которые выводятся как результат выполнения команды имеется и наша строка из переменной $equals. Соответственно мы будем проверять текст, следующим образом:
$Final = echo $iisr.Contains($equals)
Проверка реализована, едем дальше. Так как у нас есть условие для отправки письма, будет логично заранее подумать о том, что у нас появится if. Но предварительно нам необходимо задать настройки для адреса, на который отправлять письмо и адреса, с которого отправлять письмо:
$EmailFrom = «e@mail.ru»
$EmailTo =»target@mail.ru»
Пришло время добавить условия отправки письма:
if ($Final -ne «True»)
Итог:
Соответственно в теле нужно выполнить отправку письма. В переменной $Final мы получим значение либо True, либо False, поэтому в условии мы указываем, что письмо необходимо отправлять в том случае, если в переменной Final значение равно False. ПыСы: условие еще можно написать так: if ($Final -eq «False») — эквивалентно первому варианту.
В целом, весь скрипт выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#Restart iis and searching contains# $server=hostname $iisr = iisreset $equals = "Internet services successfully restarted" $Final = echo $iisr.Contains($equals) ##$Final must be True #SMTP Settings# $EmailFrom="noreply@mail.ru" $EmailTo="e@mail1.ru, e@mail2.ru" if ($Final -ne "True") { $Subject="$server iisreset failed" $Body="One of IIS instanses is not restarted. Please login on $server and see the outlog." $SmtpServer="postserv.domain.ru" $smtp=New-Object net.mail.smtpclient($SmtpServer) $smtp.Send($EmailFrom, $EmailTo, $Subject, $Body) } |
Кстати, если перезапуск IIS был успешен, то никаких отчетов не высылается. Подписывайтесь на нашу группу ВК и YouTube-канал!