Скрипт который бы запускал 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. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.
|
Цитата:
Цитата Iska
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения. »
|
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Скрипт работает только если исполняемые процессы лежат в папке windows. Иначе почему-то выдаёт сообщение об ошибке, где жалуется на:
11 строку, 2-ой символ
Ошибка: Недопустимое использование Null: 'CStr'
Код: 800А005Е
как сделать так, чтобы он работал и для других путей?
|
Цитата:
Цитата iDrug
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел. »
|
Если у Вас исполняющим ядром Windows Script Host по умолчанию является «wscript.exe» (таким оно является после установки, и у обычных пользователей, как правило, не меняется) — тогда окна консоли не будет:
читать дальше »
Цитата:
Цитата wscript.exe /?
Использование: WScript имя_сценария.расширение [параметры...] [аргументы...]
Параметры:
…
//E:ядро Использование указанного ядра для выполнения сценария
//H:CScript Стандартный сервер сценариев заменяется на CScript.exe
//H:WScript Стандартный сервер сценариев заменяется на WScript.exe (по умолчанию)
…
|
Цитата:
Цитата iDrug
Скрипт работает только если исполняемые процессы лежат в папке 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
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 скрипт) позволяет сделать то же самое только своими собственными силами. Тем не менее ваш скрипт я сохраню - мало ли где в хозяйстве пригодится? :)
|
Цитата:
Цитата iDrug
Я просто в этом ни черта не понимаю »
|
Create Method of the Win32_Process Class (Windows)
Второй параметр метода .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
…
Цитата:
Цитата iDrug
хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. »
|
Сие будет ещё лучше. Если доступен исходный текст, Вы можете его исправить так, чтобы именно он запускал «TotalCommanderPortable.exe» и следил за ним.
|
Время: 12:00.
© OSzone.net 2001-