 |
|
Jullian BrennanEG |
26-09-2016 08:37 2672184 |
Задача: перезагрузить процесс, при пропаже другого процесса
Добрый день, OSzone! Есть два процесса, один работает 2 часа, второй 4 часа. Процесс 1 запускается процессом 2 и является важным компонентом для него. При пропаже процесса 1, процесс 2 должен убиваться и запускаться заново. Он же сам запускает снова процесс 1.
Попытался накидать скрипт на VBS, но он ругается...
Код:
strTarget = "Calc.exe"
strDouble = "Notepad.exe"
strComputed= "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& "." & "\root\cimv2")
Set objTargetColl = objWMIService.ExecQuery( _
"Select * from Win32_Process " _
& "Where Name = '"& strTarget &"'")
Set objDoubleColl = objWMIService.ExecQuery( _
"Select * from Win32_Process " _
& "Where Name = '"& strDouble &"'")
If objTargetColl.Count = 0 Then
Set objInstance = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2:Win32_Process")
For Each strDouble in objDoubleColl
objDoubleColl.Terminate()
End If
|
Jullian BrennanEG |
26-09-2016 08:41 2672185 |
Может быть другую реализацию на Pshell или даже Bat... Но там как-то жутко непонятно в Shell как писать шаги.
|
Мне логика Вашего алгоритма непонятна. Вот запустили Процесс №2. Он запустил Процесс №1. Прошло два часа. Процесс №1 корректно отработал и завершился. Процесс №2 продолжает свою работу ещё два часа. Но согласно описанному Вами алгоритму, Процесс №2 должен быть снят и запущен вновь.
Поясните.
|
Jullian BrennanEG |
26-09-2016 10:03 2672208 |
Да, все верно. Процесс 2 запускает процесс 1, который живет два часа и помирает. И когда он помирает, надо перезапускать процесс 2, чтобы снова работали оба процесса. Иногда процесс 1 падает без причин, поэтому и нужна такая вещь.
|
Ясно. Для данного сценария Калькулятор и Блокнот в качестве образца не вполне годятся, поскольку запускать второй из-под первого практически невозможно несколько затруднительно :). Попробуйте так (сейчас посмотрел — вот страшилище :lol:):
Скрытый текст
Код:
Option Explicit
Dim strPath1, strPath2
Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim lngProcessID
strPath1 = "C:\Program Files\totalcmd\TOTALCMD64.EXE"
strPath2 = "c:\Windows\System32\Notepad.exe"
With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
Do
If .Get("Win32_Process").Create(strPath1, Null, Null, lngProcessID) = 0 Then
.ExecNotificationQuery( _
"SELECT * FROM __InstanceDeletionEvent WITHIN 1 " & _
"WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.ProcessID = " & CStr( _
.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 " & _
"WHERE TargetInstance ISA 'Win32_Process' AND " & _
"TargetInstance.ExecutablePath = '" & Replace(strPath2, "\", "\\") & "' AND " & _
"TargetInstance.ParentProcessId = " & CStr(lngProcessID) _
).NextEvent.TargetInstance.ProcessID _
) _
).NextEvent
.Get("Win32_Process.Handle=" & CStr(lngProcessID)).Terminate
Else
WScript.Echo "Can't execute process [" & strPath1 & "]."
Exit Do
End If
Loop
End With
WScript.Quit 0
|
Jullian BrennanEG |
26-09-2016 13:14 2672305 |
После 3 часов закуривания Осзона, ожидания каждого раза запуска скрипта в vbscript (с каждым запуском на секунду дольше) я совсем голову потерял к двум ночи))
|
Цитата:
Цитата Jullian BrennanEG
с каждым запуском на секунду дольше »
|
Вы их хоть снимаете из процессов?
|
Jullian BrennanEG |
26-09-2016 14:46 2672338 |
Цитата:
Цитата Iska
Вы их хоть снимаете из процессов? »
|
До рабочего варианта дошло лишь раз. А потом начал ругаться что он не может распознать коллекцию. А потом не смог разобратясь почему оно птосянно просит Next после End If
|
А что с предложенным мною вариантом?
|
Jullian BrennanEG |
27-09-2016 08:26 2672580 |
Не работает.
ПРи запуске скрипта запускается TC, из под него запускаю блокнот. Закрываю его, ТС не перезагружается.
Т.е хотелось бы чтобы
Скрипт запустил Процесс 1 и Процесс 2.
Следил за процессом 1, в случае его отсутствия убивал процесс 2 и запускал его снова.
Скрипт нужен для автоматической перезагрузки приложений.
|
Цитата:
Цитата Jullian BrennanEG
ПРи запуске скрипта запускается TC, из под него запускаю блокнот. Закрываю его, ТС не перезагружается. »
|
А должен.
Цитата:
Цитата Jullian BrennanEG
Т.е хотелось бы чтобы
Скрипт запустил Процесс 1 и Процесс 2. »
|
Ранее Вы говорили, что один процесс запускает другой. В примере мы просто сами, «ручками», выполняем эту функцию, запуская Блокнот.
Цитата:
Цитата Jullian BrennanEG
Следил за процессом 1, в случае его отсутствия убивал процесс 2 и запускал его снова. »
|
Именно так и должно происходить. У меня отрабатывает.
Цитата:
Цитата Jullian BrennanEG
Скрипт нужен для автоматической перезагрузки приложений. »
|
О каких именно приложениях идёт речь, можете сказать?
|
Jullian BrennanEG |
27-09-2016 09:48 2672609 |
Приложения телефонии. У них такой цикл работы. Один следит. Второй разводит все звонки.
Как только опробуем на них, отпишусь. Спасибо за помощь)
|
x0r, если б речь шла только об:
Цитата:
Цитата x0r
Запуск программы с тайм-аутом после запуска предыдущей. »
|
хватило бы пакетного файла.
И, кстати, решение там выбрано некорректное.
|
ну причем тут... то конкретное решение. Пример.
nnCron может запускать-останавливать программы-процессы тремя строчками по таймеру. Для "того" примера хватилоб и пакетного файла, да. но TS надо проверять существование процесса, запускать-останавливать при условиях - все это удобно и малыми усилиями можно сделать в nnCron.
Можно и на скриптах винды, только придется много и долго сочинять.
но это любый офтоп в теме про скрипты, знаю, да ;-)
|
x0r, Ваш бледно-белый на белом не читается.
Цитата:
Цитата x0r
малыми усилиями можно сделать в nnCron. »
|
Ну да, малыми :lol:. Forth — один из самых сложных для понимания языков.
|
Время: 09:36.
© OSzone.net 2001-