![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Скрипт мониторинга службы или порта |
|
Любой язык - [решено] Скрипт мониторинга службы или порта
|
Старожил Сообщения: 226 |
Добрый день.
Имеется некая служба (она так же имеет свой порт и свой процесс), которая иногда зависает... Требуется скрипт, который будет запускаться каждую минуту, и будет мониторить эту службу\порт. И если он не будет получать ответ от службы на протяжении, скажем 2-3 секунд, последует команда на перезапуск службы. Я с точно не знаю, на каком языке это будет лучше огранизовать... поэтому положил тему в разное. Помогите пожалуйста в написании данного скрипта. Спасибо. |
|
------- Отправлено: 13:22, 25-10-2011 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать bombording, давайте уточним общую картину — правильно ли я понял:
1. Сервер баз данных состоит из двух служб [приведите их имена, пути к исполняемым файлам, командные строки процессов, их реализующих, и зависимости других служб от данных служб] и процесса «base.exe» [он существует в единственном экземпляре? В каком контексте он запускается изначально? Приведите путь к исполняемому файлу «base.exe», командную строку процесса]. 2. Визуальным основанием для перезапуска служб является аварийное завершение процесса «base.exe». Для восстановления работоспособности сервера баз данных достаточно перезапустить обе службы [очерёдность перезапуска важна?]. После перезапуска служб, процесс «base.exe» стартует автоматически [его запускает какая-то из служб?]. |
Отправлено: 16:22, 27-10-2011 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 226
|
Профиль | Отправить PM | Цитировать Iska,
Общая картина верна. Вот описание служб. Pervasive.SQL 2000 (relational) Путь к исп. файлу: "C:\PVSW\BIN\W3SQLMGR.EXE" (данный файл так же висит в процессах.) Зависимостей нет Pervasive.SQL 2000 (transactional) Путь к исп. файлу: "C:\PVSW\BIN\NTBTRV.EXE" (данный файл так же висит в процессах.) Зависимостей нет Командной строки, как я понял у данных служб нет. Теперь по процессу: Процесс base.exe существует в единственном экземпляре и находится в C:\PVSW\Bin. Данный процесс запускается службой Pervasive.SQL 2000 (transactional). Запускается автоматически. Операция, которая приводит сервер баз данных в нерабочее состояние, гасит только процесс base.exe. Процессы служб сервера остаются в рабочем состоянии. Впринципе всё. Я так же пробовал задавать в свойствах служб режим восстановления в виде рестарта службы. Но при падении base.exe они не перезапускаются, а вот при аварийном завершении своих исполняемых файлов, служба перезапускается. |
------- Отправлено: 10:06, 28-10-2011 | #12 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать bombording:
1. Какие имена у этих служб? 2. Важен ли порядок, в котором будут перезапускаться службы? Update: 3. Может быть вопрос п.2 излишен — достаточным ли будет для восстановления работоспособности сервера баз данных перезапуск только службы «Pervasive.SQL 2000 (transactional)»? |
Последний раз редактировалось Iska, 28-10-2011 в 16:24. Причина: Добавлен п.3 Отправлено: 16:02, 28-10-2011 | #13 |
Старожил Сообщения: 226
|
Профиль | Отправить PM | Цитировать Iska,
1. службы так и называются. 2. Не важен порядок. 3. Да, для восстановления работоспособности сервера баз данных достаточно перезапустить только Pervasive.SQL 2000 (transactional) |
------- Отправлено: 16:48, 28-10-2011 | #14 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать bombording, попробуйте так (запускать под «cscript.exe»):
Option Explicit Dim strProcessName Dim strServiceNamePrimary Dim strServiceNameSecondary Dim strComputer Dim objSWbemLocator Dim objSWbemServicesEx Dim objSWbemEventSource Dim objSWbemObjectEx_ServicePrimary Dim objSWbemObjectEx_ServiceSecondary Dim collSWbemObjectSet strProcessName = "base.exe" ' "notepad.exe" strServiceNamePrimary = "Pervasive.SQL 2000 (transactional)" ' "aspnet_state" strServiceNameSecondary = "Pervasive.SQL 2000 (relational)" ' "SwPrv" strComputer = "." Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator") Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2") Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT Name FROM Win32_Service WHERE Name = '" & strServiceNamePrimary & "'") If collSWbemObjectSet.Count = 1 Then Set objSWbemObjectEx_ServicePrimary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNamePrimary & "'") Set objSWbemObjectEx_ServiceSecondary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNameSecondary & "'") WScript.StdOut.Write "Скрипт ожидает выполнения условий для начала работы..." Do objSWbemObjectEx_ServicePrimary.Refresh_ objSWbemObjectEx_ServiceSecondary.Refresh_ Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT Name FROM Win32_Process WHERE Name = '" & strProcessName & "'") If objSWbemObjectEx_ServicePrimary.Started And _ objSWbemObjectEx_ServiceSecondary.Started And _ collSWbemObjectSet.Count > 0 Then WScript.StdOut.WriteLine " Условия выполнены" Exit Do Else WScript.Sleep 100 End If Loop WScript.StdOut.WriteLine "Скрипт работает" Set objSWbemObjectEx_ServicePrimary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNamePrimary & "'") Set objSWbemObjectEx_ServiceSecondary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNameSecondary & "'") Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _ "SELECT * FROM __InstanceDeletionEvent " & _ "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND " & _ "TargetInstance.Name = '" & strProcessName & "'") Do With objSWbemEventSource.NextEvent.TargetInstance WScript.StdOut.WriteLine "Процесс [" & .Name & "] (PID: " & CStr(.ProcessID) & ") был остановлен" End With With objSWbemObjectEx_ServicePrimary WScript.StdOut.WriteLine "Служба [" & .Name & "] (PID: " & CStr(.ProcessId) & ")" .Refresh_ If .Started Then WScript.StdOut.Write " Служба останавливается" If .StopService() = 0 Then Do WScript.Sleep 100 WScript.StdOut.Write "." .Refresh_ Loop While .Started WScript.StdOut.WriteLine Else WScript.StdOut.WriteLine "Невозможно остановить службу" End If End If WScript.StdOut.Write " Служба запускается" If .StartService() = 0 Then Do WScript.Sleep 100 WScript.StdOut.Write "." .Refresh_ Loop Until .Started WScript.StdOut.WriteLine Else WScript.StdOut.WriteLine "Невозможно запустить службу" End If End With Loop Else WScript.StdOut.WriteLine "Служба [" & strServiceNamePrimary & "] не установлена" End If WScript.Quit 0 |
Отправлено: 05:07, 29-10-2011 | #15 |
Старожил Сообщения: 226
|
Профиль | Отправить PM | Цитировать Iska, Спасибо большое. Всё работает.
Единственное не хватает условия что бы при корректном выключении службы (например на время архивации), скрипт не перезапускал службу Pervasive.SQL 2000 (transactional). К примеру можно ли сделать так, что бы скрипт проверял: 1. Если служба Pervasive.SQL 2000 (transactional) запущена а процесс base.exe нет - значит произошёл сбой и необходимо перезапустить Pervasive.SQL 2000 (transactional) 2. Если служба Pervasive.SQL 2000 (transactional) остановлена и процесса base.exe нет - значит сбоя нет и служба просто остановлена, перезапуск не нужен |
------- Отправлено: 15:57, 30-10-2011 | #16 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата bombording:
|
|
Отправлено: 16:21, 30-10-2011 | #17 |
Старожил Сообщения: 226
|
Профиль | Отправить PM | Цитировать Iska, судя по Process Monitor. Процесс base.exe запускается любой из двух служб. Точнее одним из исполняемым файлом, той или иной службы.
Если, к примеру все службы остановлены и я запускаю Pervasive.SQL 2000 (relational) первой, то её исполняемый файл C:\PVSW\BIN\W3SQLMGR.EXE запускает base.exe. Соответственно если я остановлю эту службу, то процесс C:\PVSW\BIN\W3SQLMGR.EXE пропадёт и base.exe так же с ним пропадёт. Такая же ситуация если я запущу первой 2-ю службу Pervasive.SQL 2000 (transactional), её исполняемый файл "C:\PVSW\BIN\NTBTRV.EXE" запустит процесс base.exe и остановит его в случае остановки службы. |
------- Отправлено: 16:36, 30-10-2011 | #18 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать bombording, спасибо, ясно. Ближе к ночи поправлю код.
|
Отправлено: 17:50, 30-10-2011 | #19 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Попробуйте так:
Option Explicit Dim strProcessName Dim strServiceNamePrimary Dim strServiceNameSecondary Dim strComputer Dim objSWbemLocator Dim objSWbemServicesEx Dim objSWbemEventSource Dim objSWbemObjectEx_ServicePrimary Dim objSWbemObjectEx_ServiceSecondary Dim collSWbemObjectSet strProcessName = "base.exe" ' "notepad.exe" strServiceNamePrimary = "Pervasive.SQL 2000 (transactional)" ' "aspnet_state" strServiceNameSecondary = "Pervasive.SQL 2000 (relational)" ' "SwPrv" strComputer = "." Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator") Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2") Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT Name FROM Win32_Service WHERE Name = '" & strServiceNamePrimary & "'") If collSWbemObjectSet.Count = 1 Then Set objSWbemObjectEx_ServicePrimary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNamePrimary & "'") Set objSWbemObjectEx_ServiceSecondary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNameSecondary & "'") WScript.StdOut.Write "Скрипт ожидает выполнения условий для начала работы..." Do objSWbemObjectEx_ServicePrimary.Refresh_ objSWbemObjectEx_ServiceSecondary.Refresh_ Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT Name FROM Win32_Process WHERE Name = '" & strProcessName & "'") If objSWbemObjectEx_ServicePrimary.Started And _ objSWbemObjectEx_ServiceSecondary.Started And _ collSWbemObjectSet.Count > 0 Then WScript.StdOut.WriteLine " Условия выполнены" Exit Do Else WScript.Sleep 100 End If Loop WScript.StdOut.WriteLine "Скрипт работает" Set objSWbemObjectEx_ServicePrimary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNamePrimary & "'") Set objSWbemObjectEx_ServiceSecondary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNameSecondary & "'") Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _ "SELECT * FROM __InstanceDeletionEvent " & _ "WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND " & _ "TargetInstance.Name = '" & strProcessName & "'") Do With objSWbemEventSource.NextEvent.TargetInstance WScript.StdOut.WriteLine "Процесс [" & .Name & "] (PID: " & CStr(.ProcessID) & ") был остановлен" End With With objSWbemObjectEx_ServicePrimary WScript.StdOut.WriteLine "Служба [" & .Name & "] (PID: " & CStr(.ProcessId) & ")" .Refresh_ If .Started Then WScript.StdOut.Write " Служба останавливается" If .StopService() = 0 Then Do WScript.Sleep 100 WScript.StdOut.Write "." .Refresh_ Loop While .Started WScript.StdOut.WriteLine Else WScript.StdOut.WriteLine "Невозможно остановить службу" End If WScript.StdOut.Write " Служба запускается" If .StartService() = 0 Then Do WScript.Sleep 100 WScript.StdOut.Write "." .Refresh_ Loop Until .Started WScript.StdOut.WriteLine Else WScript.StdOut.WriteLine "Невозможно запустить службу" End If Else ' Nothing to do End If End With Loop Else WScript.StdOut.WriteLine "Служба [" & strServiceNamePrimary & "] не установлена" End If WScript.Quit 0 |
Отправлено: 07:06, 31-10-2011 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Любой язык - [решено] Нужен скрипт для мониторинга событий, с условием. | root221 | Скриптовые языки администрирования Windows | 8 | 18-07-2011 16:50 | |
Прочее - Стабильный SSH туннель. Скрипт мониторинга SSH туннеля. | AlexeiZ | Общий по Linux | 2 | 02-11-2009 12:49 | |
VBS/WSH/JS - скрипт мониторинга свободного места | Grub | Скриптовые языки администрирования Windows | 3 | 24-06-2009 10:06 | |
Драйвер - [решено] Сбой при запуске службы "Драйвер параллельного порта" | arkvis | Microsoft Windows 2000/XP | 3 | 28-03-2009 13:54 | |
Разное - скрипт на запуск службы | cas | Программирование и базы данных | 11 | 11-12-2008 03:16 |
|