Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой

Ответить
Аватара пользователя
iDrug

Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой

Сообщение iDrug »

Здрасте, вот вопрос такой:

Не знаю какой из скриптовых языков администрирования такое может и главное - как это сделать?

Суть требований такова: запускать сразу 2 процесса одновременно, и проверять, когда первый умрёт (я выгружу программу эту вручную), то надо убить и 2-ой процесс. И главное чтобы при этом не висело чёрное окно cmd или чего-то подобного.
Аватара пользователя
Iska

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

Сообщение Iska »

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

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

Сообщение iDrug »

Цитата Iska:



Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой




Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.

Скрипт работает только если исполняемые процессы лежат в папке windows. Иначе почему-то выдаёт сообщение об ошибке, где жалуется на:

11 строку, 2-ой символ

Ошибка: Недопустимое использование Null: 'CStr'

Код: 800А005Е



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

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

Сообщение Iska »

Цитата iDrug:



Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой




Если у Вас исполняющим ядром Windows Script Host по умолчанию является «wscript.exe» (таким оно является после установки, и у обычных пользователей, как правило, не меняется) — тогда окна консоли не будет:


читать дальше »



Цитата wscript.exe /?:



Использование: WScript имя_сценария.расширение [параметры...] [аргументы...]



Параметры:



//E:ядро Использование указанного ядра для выполнения сценария

//H:CScript Стандартный сервер сценариев заменяется на CScript.exe

//H:WScript Стандартный сервер сценариев заменяется на WScript.exe (по умолчанию)










Цитата iDrug:



Скрипт работает только если исполняемые процессы лежат в папке windows.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой




Не совсем так. Метод «.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; …
Аватара пользователя
iDrug

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

Сообщение iDrug »

и всё равно у меня почему-то выдаёт ту же ошибку...

вот как у меня:



Код:

Код: Выделить всё

		.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

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

Сообщение Iska »

iDrug,

а) у Вас существует каталог «c:\temp»?

б) подозреваю, что, возможно, следить надо будет не за «TotalCommanderPortable.exe». Впрочем, сначала ответьте на а).
Аватара пользователя
iDrug

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

Сообщение iDrug »

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

исправил на любой другой существующий путь - и скрипт заработал, спасибо.



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

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

Сообщение Iska »

Цитата iDrug:



Я просто в этом ни черта не понимаю
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой




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 скрипт) позволяет сделать то же самое только своими собственными силами.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой




Сие будет ещё лучше. Если доступен исходный текст, Вы можете его исправить так, чтобы именно он запускал «TotalCommanderPortable.exe» и следил за ним.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»