Войти

Показать полную графическую версию : [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой


iDrug
12-10-2009, 00:09
Здрасте, вот вопрос такой:
Не знаю какой из скриптовых языков администрирования такое может и главное - как это сделать?
Суть требований такова: запускать сразу 2 процесса одновременно, и проверять, когда первый умрёт (я выгружу программу эту вручную), то надо убить и 2-ой процесс. И главное чтобы при этом не висело чёрное окно cmd или чего-то подобного.

Iska
12-10-2009, 03:15
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. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.

iDrug
12-10-2009, 03:55
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения. »Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Скрипт работает только если исполняемые процессы лежат в папке windows. Иначе почему-то выдаёт сообщение об ошибке, где жалуется на:
11 строку, 2-ой символ
Ошибка: Недопустимое использование Null: 'CStr'
Код: 800А005Е

как сделать так, чтобы он работал и для других путей?

Iska
12-10-2009, 06:01
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел. »
Если у Вас исполняющим ядром 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; …

iDrug
12-10-2009, 14:01
и всё равно у меня почему-то выдаёт ту же ошибку...
вот как у меня:
.Create "C:\\Portable soft\\TotalCommanderPortable\\TotalCommanderPortable.exe", "c:\\temp", Nothing, lngProcessID1
.Create "C:\\Portable soft\\TotalCommanderPortable\\megascroll.exe", "c:\\temp", Nothing, lngProcessID2
сам *.vbs скрипт при этом находится в той же папке где и 2 программы, которые я хочу запустить.

Iska
12-10-2009, 17:28
iDrug,
а) у Вас существует каталог «c:\temp»?
б) подозреваю, что, возможно, следить надо будет не за «TotalCommanderPortable.exe». Впрочем, сначала ответьте на а).

iDrug
12-10-2009, 17:47
спасибо, указали на ошибку. Я просто в этом ни черта не понимаю и подумал что он проверяет по 1-ому пути и если там нет этого объекта то ищет по второму, потому я во втором пути и указал несуществующий путь, т.к. подумал что он нафиг не нужен.
исправил на любой другой существующий путь - и скрипт заработал, спасибо.

p.s.: хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. Тем не менее ваш скрипт я сохраню - мало ли где в хозяйстве пригодится? :)

Iska
12-10-2009, 19:08
Я просто в этом ни черта не понимаю »
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