Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Задача: перезагрузить процесс, при пропаже другого процесса (http://forum.oszone.net/showthread.php?t=319142)

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 как писать шаги.

Iska 26-09-2016 08:49 2672187

Мне логика Вашего алгоритма непонятна. Вот запустили Процесс №2. Он запустил Процесс №1. Прошло два часа. Процесс №1 корректно отработал и завершился. Процесс №2 продолжает свою работу ещё два часа. Но согласно описанному Вами алгоритму, Процесс №2 должен быть снят и запущен вновь.

Поясните.

Jullian BrennanEG 26-09-2016 10:03 2672208

Цитата:

Цитата Iska
Поясните. »

Да, все верно. Процесс 2 запускает процесс 1, который живет два часа и помирает. И когда он помирает, надо перезапускать процесс 2, чтобы снова работали оба процесса. Иногда процесс 1 падает без причин, поэтому и нужна такая вещь.

Iska 26-09-2016 11:24 2672244

Ясно. Для данного сценария Калькулятор и Блокнот в качестве образца не вполне годятся, поскольку запускать второй из-под первого практически невозможно несколько затруднительно :). Попробуйте так (сейчас посмотрел — вот страшилище :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 (с каждым запуском на секунду дольше) я совсем голову потерял к двум ночи))

Iska 26-09-2016 13:17 2672307

Цитата:

Цитата Jullian BrennanEG
с каждым запуском на секунду дольше »

Вы их хоть снимаете из процессов?

Jullian BrennanEG 26-09-2016 14:46 2672338

Цитата:

Цитата Iska
Вы их хоть снимаете из процессов? »

До рабочего варианта дошло лишь раз. А потом начал ругаться что он не может распознать коллекцию. А потом не смог разобратясь почему оно птосянно просит Next после End If

Iska 26-09-2016 14:49 2672342

А что с предложенным мною вариантом?

Jullian BrennanEG 27-09-2016 08:26 2672580

Не работает.
ПРи запуске скрипта запускается TC, из под него запускаю блокнот. Закрываю его, ТС не перезагружается.
Т.е хотелось бы чтобы
Скрипт запустил Процесс 1 и Процесс 2.
Следил за процессом 1, в случае его отсутствия убивал процесс 2 и запускал его снова.
Скрипт нужен для автоматической перезагрузки приложений.

Iska 27-09-2016 08:35 2672583

Цитата:

Цитата Jullian BrennanEG
ПРи запуске скрипта запускается TC, из под него запускаю блокнот. Закрываю его, ТС не перезагружается. »

А должен.

Цитата:

Цитата Jullian BrennanEG
Т.е хотелось бы чтобы
Скрипт запустил Процесс 1 и Процесс 2. »

Ранее Вы говорили, что один процесс запускает другой. В примере мы просто сами, «ручками», выполняем эту функцию, запуская Блокнот.

Цитата:

Цитата Jullian BrennanEG
Следил за процессом 1, в случае его отсутствия убивал процесс 2 и запускал его снова. »

Именно так и должно происходить. У меня отрабатывает.

Цитата:

Цитата Jullian BrennanEG
Скрипт нужен для автоматической перезагрузки приложений. »

О каких именно приложениях идёт речь, можете сказать?

Jullian BrennanEG 27-09-2016 09:48 2672609

Приложения телефонии. У них такой цикл работы. Один следит. Второй разводит все звонки.
Как только опробуем на них, отпишусь. Спасибо за помощь)

x0r 27-09-2016 10:42 2672620

ну для такой задачи прям просится nnCron Запуск программы с тайм-аутом после запуска предыдущей.

Iska 27-09-2016 10:56 2672624

x0r, если б речь шла только об:
Цитата:

Цитата x0r
Запуск программы с тайм-аутом после запуска предыдущей. »

хватило бы пакетного файла.

И, кстати, решение там выбрано некорректное.

x0r 27-09-2016 11:36 2672636

ну причем тут... то конкретное решение. Пример.
nnCron может запускать-останавливать программы-процессы тремя строчками по таймеру. Для "того" примера хватилоб и пакетного файла, да. но TS надо проверять существование процесса, запускать-останавливать при условиях - все это удобно и малыми усилиями можно сделать в nnCron.
Можно и на скриптах винды, только придется много и долго сочинять.
но это любый офтоп в теме про скрипты, знаю, да ;-)

Iska 27-09-2016 16:23 2672718

x0r, Ваш бледно-белый на белом не читается.

Цитата:

Цитата x0r
малыми усилиями можно сделать в nnCron. »

Ну да, малыми :lol:. Forth — один из самых сложных для понимания языков.


Время: 09:36.

Время: 09:36.
© OSzone.net 2001-