Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Скрипт мониторинга службы или порта

Ответить
Настройки темы
Любой язык - [решено] Скрипт мониторинга службы или порта

Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


Добрый день.
Имеется некая служба (она так же имеет свой порт и свой процесс), которая иногда зависает...
Требуется скрипт, который будет запускаться каждую минуту, и будет мониторить эту службу\порт. И если он не будет получать ответ от службы на протяжении, скажем 2-3 секунд, последует команда на перезапуск службы.

Я с точно не знаю, на каком языке это будет лучше огранизовать... поэтому положил тему в разное.

Помогите пожалуйста в написании данного скрипта.
Спасибо.

-------
Альтернатива Всему!


Отправлено: 13:22, 25-10-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


bombording, давайте уточним общую картину — правильно ли я понял:

1. Сервер баз данных состоит из двух служб [приведите их имена, пути к исполняемым файлам, командные строки процессов, их реализующих, и зависимости других служб от данных служб] и процесса «base.exe» [он существует в единственном экземпляре? В каком контексте он запускается изначально? Приведите путь к исполняемому файлу «base.exe», командную строку процесса].

2. Визуальным основанием для перезапуска служб является аварийное завершение процесса «base.exe». Для восстановления работоспособности сервера баз данных достаточно перезапустить обе службы [очерёдность перезапуска важна?]. После перезапуска служб, процесс «base.exe» стартует автоматически [его запускает какая-то из служб?].
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:22, 27-10-2011 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить 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
Благодарности: 8088

Профиль | Отправить PM | Цитировать


bombording:

1. Какие имена у этих служб?
Код: Выделить весь код
wmic.exe service get name
2. Важен ли порядок, в котором будут перезапускаться службы?

Update:
3. Может быть вопрос п.2 излишен — достаточным ли будет для восстановления работоспособности сервера баз данных перезапуск только службы «Pervasive.SQL 2000 (transactional)»?

Последний раз редактировалось Iska, 28-10-2011 в 16:24. Причина: Добавлен п.3

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:02, 28-10-2011 | #13


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


Iska,

1. службы так и называются.

2. Не важен порядок.

3. Да, для восстановления работоспособности сервера баз данных достаточно перезапустить только Pervasive.SQL 2000 (transactional)

-------
Альтернатива Всему!


Отправлено: 16:48, 28-10-2011 | #14


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить 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
читать дальше »

В комментариях скрипта — то, на чём я тренировался. Примерный вывод скрипта:
Цитата:
Код: Выделить весь код
Скрипт ожидает выполнения условий для начала работы... Условия выполнены
Скрипт работает
Процесс [notepad.exe] (PID: 22884) был остановлен
Служба [aspnet_state] (PID: 18568)
  Служба останавливается............................
  Служба запускается.
Процесс [notepad.exe] (PID: 22988) был остановлен
Служба [aspnet_state] (PID: 22940)
  Служба останавливается..................
  Служба запускается.
«Блокнот» я, разумеется, запускал сам, имитируя службу «Pervasive.SQL 2000 (transactional)».
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:07, 29-10-2011 | #15


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить 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
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата bombording:
Единственное не хватает условия что бы при корректном выключении службы (например на время архивации), скрипт не перезапускал службу Pervasive.SQL 2000 (transactional).
К примеру можно ли сделать так, что бы скрипт проверял:
1. Если служба Pervasive.SQL 2000 (transactional) запущена а процесс base.exe нет - значит произошёл сбой и необходимо перезапустить Pervasive.SQL 2000 (transactional)
2. Если служба Pervasive.SQL 2000 (transactional) остановлена и процесса base.exe нет - значит сбоя нет и служба просто остановлена, перезапуск не нужен »
Суть в том, что скрипт сидит и ждёт события, когда будет завершён процесс «base.exe». Вы уверены в том, что процесс «base.exe» завершается после остановки службы «Pervasive.SQL 2000 (transactional)»? Проверьте сие с помощью «Process Monitor», выставив фильтр по «Process Close», и отпишитесь сюда.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:21, 30-10-2011 | #17


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить 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
Благодарности: 8088

Профиль | Отправить PM | Цитировать


bombording, спасибо, ясно. Ближе к ночи поправлю код.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:50, 30-10-2011 | #19


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить 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
Я просто передвинул запуск службы внутрь условия «If .Started …». Собственно, так у меня и было изначально, но затем я подумал — «А если служба вдруг будет по каким-то причинам к этому моменту остановлена? Надо сие уметь обрабатывать, и просто запускать службу!».
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:06, 31-10-2011 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Скрипт мониторинга службы или порта

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Нужен скрипт для мониторинга событий, с условием. 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




 
Переход