Показать полную графическую версию : [решено] Кавычки внутри кавычек в VBS
Спасибо, Iska! Это хорошее решение, но хотелось бы доработать этот код с такой целью, что: а вдруг сервис завис и простая остановка тут не поможет? Тогда, подождав секунд 10, будет необходимо убить соответствующий процесс и запустить сервис заново. Как будет выглядеть скрипт именно с такой задачей?
Во-первых, нужно не снимать процесс, а разбираться в причинах зависания сервиса. Во-вторых, логика «остановить сервис; если не останавливается — снять процесс сервиса, затем запустить сервис заново» мне не понятна.
Во-первых, нужно не снимать процесс, а разбираться в причинах зависания сервиса. Во-вторых, логика «остановить сервис; если не останавливается — снять процесс сервиса, затем запустить сервис заново» мне не понятна. »
Всё просто: Windows есть Windows и зависание программ в этой ОС еще никто не отменял. Суть задания такая, что программа будет следить за работой ftp сервера, через который происходит обмен с региональными офисами (распределенный базы 1С), важно обеспечить бесперебойность работы этого обмена. Если сервис завис (а часто бывает так, что ты пытаешься остановить его и строка остановки медленно-медленно двигается, но сервис завис он не может быть остановлен штатно, приходится вручную убивать соответствующий процесс и запускать сервис заново - опля! все снова заработало, до следующего глюка). Так понятнее?
Просто все это сейчас делается руками по звонку одного из филиалов - надо автоматизировать)
У меня не случалось, чтобы служба «FileZilla Server» зависала. Если у Вас, как Вы пишете:
а часто бывает так, что ты пытаешься остановить его и строка остановки медленно-медленно двигается, но сервис завис он не может быть остановлен штатно »
— Вы пытались найти причину такого поведения?
Просто все это сейчас делается руками по звонку одного из филиалов - надо автоматизировать) »
Поясните по поводу автоматизации. В новом сценарии звонок из филиала остаётся в наличии?
Iska, меня полностью устраивает ваше решение
Все что мне нужно это доработать это решение до примерно такого:
Option Explicit
Dim strServiceName
Dim objSWbemObjectEx
strServiceName = "messenger"
With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
With .Get("Win32_Service.Name='" & strServiceName & "'")
If .State = "Running" Then
If Not .StopService() = 0 Then
Sleep 20000 'Ждем - может процесс все-таки с задержкой, но завершится
If .State = "Running" Then 'Если и спустя 20 секунд все еще запущен,то
'Вызов функции поиска ID процесса, отвечающего за зависший сервис
'"Убийство соответствующего PID
'Вызов функции стартующей сервис
End If
End If
End If
End With
End With
WScript.Quit 0
Iska, я уверен тебе вполне по силам помочь в данной задачке, пожалуйста помоги, а историю своей жизни и работы я как-нибудь в следующий раз распишу.
Спасибо!
Поясните по поводу автоматизации. В новом сценарии звонок из филиала остаётся в наличии? »
Зачем звонок если сервис будет самовосстанавливаться автоматически (средствами винды - задание по расписанию)?
C0D3X, у Вас нет задачи. У Вас есть придуманное якобы решение, которое ни разу не решает реальной задачи.
Что на самом деле происходит со службой? Как определяете, что она «зависает»? Что сообщает ОС о «зависшей» службе? Что в журналах событий? Что в логах самой службы? Каково состояние службы в этот момент? Вот какие вопросы надо задавать, и какие задачи решать, вместо того, чтобы тупо периодически перезапускать службу в процессе работы. Это не решение, это извращение. Попытка закрыть глаза на реально существующую проблему.
Я, конечно, нарисую Вашу хотелку, но проверить её работоспособность банально не смогу, поскольку у меня никогда такой проблемы с «FileZilla Server» не возникало.
Option Explicit
Dim strServiceName
Dim objSWbemServicesEx
Dim objSWbemObjectEx
strServiceName = "FileZilla Server"
Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
If objSWbemObjectEx.Started Then
If objSWbemObjectEx.AcceptStop Then
If objSWbemObjectEx.StopService() = 0 Then
Do
WScript.Sleep 100
Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
Loop While objSWbemObjectEx.Started
StartService
Else
WScript.Echo "Can't stop service [" & strServiceName & "]."
With objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(objSWbemObjectEx.ProcessID) & "'")
If .Terminate() = 0 Then
StartService
Else
WScript.Echo "Can't terminate process of service [" & strServiceName & "]."
End If
End With
End If
Else
WScript.Echo "Service [" & strServiceName & "] can't be stopped."
End If
Else
StartService
End If
Set objSWbemObjectEx = Nothing
Set objSWbemServicesEx = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub StartService()
If objSWbemObjectEx.StartService() = 0 Then
Do
WScript.Sleep 100
Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
Loop Until objSWbemObjectEx.Started
Else
WScript.Echo "Can't start service [" & strServiceName & "]."
End If
End Sub
'=============================================================================
Iska, огромное спасибо! Абалденный код! :)
А на счет вопросов: у меня тоже пока не было проблем, но поднять этот сервис пришлось совсем недавно и большого опыта работы с ним нет, а в отпуск уходить совсем скоро... Так вот такая последовательность действий решает 99% процентов проблем, которые могут случиться с сервисом, а это значит, что меня не вытащат посреди отпуска на работу из-за того, что не работает FTP. Возможно траблы не случаться вобще никогда и этот код так никогда на 100% и не сработает, но ведь предвидеть и попытаться предотвратить лучше, чем предвидеть и ждать "авось".... Согласны? :)
Еще раз большое спасибо!
А на счет вопросов: у меня тоже пока не было проблем, »
[Iska бьётся головой об стену] Так какого ж @#$%…
Iska, голову осторожнее она еще пригодится и не только тебе. От чего столько негодующих эмоций?! Тебя попросили помочь и ты помог, причем этим кодом дал много пищи для размышлений о том как автоматизировать другие процесс, так как, например, запуск 1с с определенной обработкой, перезапуск процессов отвечающих за связь с торг.представителями. Короче, Iska, Все норм! твой код послужил примером для написания еще 3 скриптов, так что что жил, то не зря ;) Удачи! и больше позитива :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.