1 (изменено: DaVinchi, 2016-07-24 14:15:51)

Тема: AHK: Закрытие устаревших дочерних процессов

Не знаю, правильно ли назвал тему или нет. Пока что наработок нет, еще не придумал что в моем случае можно сделать.
Суть проблемы следующая. Есть некое приложение Krutub.exe, которое в процессе своей работы создает еще один процесс CefSharp.BrowserSubprocess.exe. По идее по окончанию работы с одним процессом CefSharp.BrowserSubprocess.exe он должен его закрывать и открывать новый, но по какой то известной только разработчику причине, он этого не делает. И если открыть диспетчер задач, то можно увидеть кучу мусора, который кушает физическую память.
Тут я пытался вставить ссылку на скрин, который я залил в атач.
Так вот! Как бы при помощи AHK, убивать устаревшие процессы? Т.е. крутуб.ехе имеет открытый CefSharp.BrowserSubprocess.exe и когда открывается новый CefSharp.BrowserSubprocess.exe, старый убивался?
Одна из идей была, при открытии CefSharp.BrowserSubprocess.exe, записывать его PID и при появлении еще одного CefSharp.BrowserSubprocess.exe, у которого будет другой PID, закрывать первый. Но тут пришла другая проблема. На одном компьютере может быть запущено 2 программы Krutube.exe и обе буду создавать дочерние процессы CefSharp.BrowserSubprocess.exe. Т.е. если сделать так, как я сначала подумал, то при создании другой программой процесса с таким именем, он будет закрывать действующий процесс.
Самый реальный вариант на данный момент, мне кажется это использовать RunWait, но с ним я еще не работал и как реализовать еще не разобрался. РанВайт мне нравится тем, что я указываю путь откуда будет запущена программа, так как у 2х Krutube.exe и соответственно дочерних процессов разные папки дислокации.
Так же еще вариант Proccess Wait, но тут возвращаемся к 2м параллельно запущенным программам.
Ну и тот же WinWait, но тут снова кость в горле это множество одинаковых окон.
Укажите правильный путь, подскажите как можно реализовать мою задачу?

Post's attachments

2016-07-22_18-26-27.png 65.45 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Закрытие устаревших дочерних процессов

Теоретически как то так. При закрытии Krutub.exe, закрываются все процессы CefSharp.BrowserSubprocess.exe являющиеся дочерними закрытому.


#SingleInstance Force
#Persistent
#NoEnv 
SetBatchLines -1 

oSvc := ComObjGet("winmgmts:") 
ComObjConnect(deleteSink := ComObjCreate("WbemScripting.SWbemSink"), "ProcessDelete_")

Command := "Within 0.1 Where TargetInstance ISA 'Win32_Process'"
oSvc.ExecNotificationQueryAsync(deleteSink, "select * from __InstanceDeletionEvent " Command)
Return

ProcessDelete_OnObjectReady(obj) {
	Process := obj.TargetInstance
	If (Process.Name != "Krutub.exe")
		Return
	Query := "SELECT * FROM Win32_Process WHERE Name = 'CefSharp.BrowserSubprocess.exe' AND ParentProcessID = " Process.ProcessID
	For Proc In ComObjGet("winmgmts:").ExecQuery(Query) 
		Proc.Terminate()
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Закрытие устаревших дочерних процессов

serzh82saratov Не, эт не то. Ведь Krutube.exe продолжает работать.
Суть программы такова: Krutub.exe является как бы оболочкой с настройкой. Внеся все нужные настройки в этой программе, нажимаем пуск и с учетом настроек начинает открываться CefSharp.BrowserSubprocess.exe. Вот он открывался, выполнил свою задачу и закрывается. Krutube.exe открывает новый CefSharp.BrowserSubprocess.exe и так по кругу. По идее старый субпроцесс должен был закрыться, он не закрывается и висит в процессах, кушая память.

4

Re: AHK: Закрытие устаревших дочерних процессов

При запуске CefSharp.BrowserSubprocess.exe закрываем остальные CefSharp.BrowserSubprocess.exe с таким же родительским процессом.

#SingleInstance Force
#Persistent
#NoEnv 
SetBatchLines -1 

oSvc := ComObjGet("winmgmts:") 
ComObjConnect(createSink := ComObjCreate("WbemScripting.SWbemSink"), "ProcessCreate_")

Command := "Within 0.1 Where TargetInstance ISA 'Win32_Process'"
oSvc.ExecNotificationQueryAsync(createSink, "select * from __InstanceCreationEvent " Command)
Return

ProcessCreate_OnObjectReady(obj) {
	Process := obj.TargetInstance
	If (Process.Name != "CefSharp.BrowserSubprocess.exe")
		Return
	Query := "SELECT * FROM Win32_Process WHERE Name = 'CefSharp.BrowserSubprocess.exe' AND ParentProcessID = "
		. Process.ParentProcessID " AND ProcessID != " Process.ProcessID 
	For Proc In ComObjGet("winmgmts:").ExecQuery(Query) 
		Proc.Terminate()
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Закрытие устаревших дочерних процессов

serzh82saratov Воу. Это то что нужно. Причем и работает на ура.
Сейчас читаю эту конструкцию и понимаю, что я многое упустил за эти годы и AHK ушла далеко в перед.

6

Re: AHK: Закрытие устаревших дочерних процессов

Не знаю у одного ли меня такое, но из-за скрипта с

oSvc := ComObjGet("winmgmts:") 
ComObjConnect(createSink := ComObjCreate("WbemScripting.SWbemSink"), "ProcessCreate_")
ComObjConnect(deleteSink := ComObjCreate("WbemScripting.SWbemSink"), "ProcessDelete_")
Command := "WITHIN 0.5 WHERE TargetInstance ISA 'Win32_Process'"
oSvc.ExecNotificationQueryAsync(createSink, "SELECT * FROM __InstanceCreationEvent " Command)
oSvc.ExecNotificationQueryAsync(deleteSink, "SELECT * FROM __InstanceDeletionEvent " Command)

Появляется такая особенность, что PIDы процессов перестают ре-использоваться и начинают расти как на дрожжах: после всего пары дней аптайма системы PIDы становятся по 40000-60000, а если аптайм неделя или больше, то значения PIDов доходят до миллионов и выше.

7 (изменено: Alectric, 2016-09-13 18:08:41)

Re: AHK: Закрытие устаревших дочерних процессов

Возможно объект создается бесконечное количество раз, без "отпускания" (ObjRelease) старого объекта.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

8

Re: AHK: Закрытие устаревших дочерних процессов

Alectric, нет, он создаётся только однократно при старте. Правда, может это у меня в системе что-то с WMI.