Показать полную графическую версию : [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Здрасте, вот вопрос такой:
Не знаю какой из скриптовых языков администрирования такое может и главное - как это сделать?
Суть требований такова: запускать сразу 2 процесса одновременно, и проверять, когда первый умрёт (я выгружу программу эту вручную), то надо убить и 2-ой процесс. И главное чтобы при этом не висело чёрное окно cmd или чего-то подобного.
iDrug, практически любой. Вот пример на VBScript на основе WMI:
Sample.vbs
Option Explicit
Dim lngProcessID1, lngProcessID2
With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
With .Get("Win32_Process")
.Create "notepad.exe", "c:\\temp", Nothing, lngProcessID1
.Create "calc.exe", "c:\\windows", Nothing, lngProcessID2
End With
.ExecNotificationQuery( _
"SELECT * FROM __InstanceDeletionEvent WITHIN 1 " & _
"WHERE TargetInstance ISA 'Win32_Process' AND " & _
"TargetInstance.ProcessID = '" & CStr(lngProcessID1) & "'").NextEvent
On Error Resume Next
.Get("Win32_Process.Handle='" & CStr(lngProcessID2) & "'").Terminate
On Error Goto 0
End With
WScript.Quit 0
«On Error Resume Next/On Error Goto 0» нужно на случай, если второй процесс будет закрыт ранее, нежели будет закрыт первый.
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения. »Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Скрипт работает только если исполняемые процессы лежат в папке windows. Иначе почему-то выдаёт сообщение об ошибке, где жалуется на:
11 строку, 2-ой символ
Ошибка: Недопустимое использование Null: 'CStr'
Код: 800А005Е
как сделать так, чтобы он работал и для других путей?
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел. »
Если у Вас исполняющим ядром Windows Script Host по умолчанию является «wscript.exe» (таким оно является после установки, и у обычных пользователей, как правило, не меняется) — тогда окна консоли не будет:
Использование: WScript имя_сценария.расширение [параметры...] [аргументы...]
Параметры:
…
//E:ядро Использование указанного ядра для выполнения сценария
//H:CScript Стандартный сервер сценариев заменяется на CScript.exe
//H:WScript Стандартный сервер сценариев заменяется на WScript.exe (по умолчанию)
…
Скрипт работает только если исполняемые процессы лежат в папке windows.»
Не совсем так. Метод «.Create()» класса «Win32_Process», если не указан путь, ищет исполняемые файлы в текущем каталоге, затем в каталогах, перечисленных в переменной окружения PATH:
Option Explicit
Dim lngProcessID1, lngProcessID2
With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
With .Get("Win32_Process")
.Create "c:\\program files\\far\\far.exe", "c:\\temp", Nothing, lngProcessID1
.Create "winrar.exe", "c:\\windows", Nothing, lngProcessID2
End With
.ExecNotificationQuery( _
"SELECT * FROM __InstanceDeletionEvent WITHIN 1 " & _
"WHERE TargetInstance ISA 'Win32_Process' AND " & _
"TargetInstance.ProcessID = '" & CStr(lngProcessID1) & "'").NextEvent
On Error Resume Next
.Get("Win32_Process.Handle='" & CStr(lngProcessID2) & "'").Terminate
On Error Goto 0
End With
WScript.Quit 0
В этом примере «Far Manager» запускается с использованием полного пути (ещё раз обратите внимание на использование двух слэшэй в качестве разделителей), а Winrar.exe — без указания, поскольку в PATH присутствует путь к каталогу Winrar'а:
PATH=C:\WINDOWS\SYSTEM32;C:\WINDOWS;C:\WINDOWS\SYSTEM32\WBEM; … C:\PROGRAM FILES\WINRAR; …
и всё равно у меня почему-то выдаёт ту же ошибку...
вот как у меня:
.Create "C:\\Portable soft\\TotalCommanderPortable\\TotalCommanderPortable.exe", "c:\\temp", Nothing, lngProcessID1
.Create "C:\\Portable soft\\TotalCommanderPortable\\megascroll.exe", "c:\\temp", Nothing, lngProcessID2
сам *.vbs скрипт при этом находится в той же папке где и 2 программы, которые я хочу запустить.
iDrug,
а) у Вас существует каталог «c:\temp»?
б) подозреваю, что, возможно, следить надо будет не за «TotalCommanderPortable.exe». Впрочем, сначала ответьте на а).
спасибо, указали на ошибку. Я просто в этом ни черта не понимаю и подумал что он проверяет по 1-ому пути и если там нет этого объекта то ищет по второму, потому я во втором пути и указал несуществующий путь, т.к. подумал что он нафиг не нужен.
исправил на любой другой существующий путь - и скрипт заработал, спасибо.
p.s.: хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. Тем не менее ваш скрипт я сохраню - мало ли где в хозяйстве пригодится? :)
Я просто в этом ни черта не понимаю »
Create Method of the Win32_Process Class (Windows) (http://msdn.microsoft.com/en-us/library/aa389388(VS.85).aspx)
Второй параметр метода .Create() задаёт текущий каталог для запускаемого приложения (примерно то же, что и «Рабочая папка» в свойствах ярлыка). Его можно задать, например, равным каталогу, откуда запускается скрипт:
…
Dim strScriptPath
strScriptPath = WScript.CreateObject("Scripting.FileSystemObject").GetFile(WScript.ScriptFullName).ParentFolder
With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
With .Get("Win32_Process")
.Create "C:\\Portable soft\\TotalCommanderPortable\\TotalCommanderPortable.exe", strScriptPath, Nothing, lngProcessID1
…
хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. »
Сие будет ещё лучше. Если доступен исходный текст, Вы можете его исправить так, чтобы именно он запускал «TotalCommanderPortable.exe» и следил за ним.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.