Войти

Показать полную графическую версию : [решено] как отследить падение процесса, если их запущено несколько?


diamonster
14-07-2010, 12:37
мне нужно написать простейший watchdog. если процесс не обнаружен - запустить.
дело усложняется тем, что одинаковых процессов должно быть запущено несколько, просто из разных папок, с разными конфигами.
ProcessExists($proc) отслеживает только имя процесса, соответственно если отвалился один из трёх, то эта функция никак не реагирует.
есть ли какое-то решение проблемы?

Creat0R
14-07-2010, 13:03
Можно искать в списке процессов по исполняемому пути к процессу:

$aRun_Processes = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)(@SystemDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@systemdir) & "\Notepad.exe" & "|" & @WindowsDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@windowsdir) & "\Regedit.exe", "|")

HotKeySet (http://www.autoitscript.com/autoit3/docs/functions/HotKeySet.htm)("{ESC}", "_Quit")

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(1000)
$aProcList = _ProcessListEx()

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aRun_Processes[0]
$bFound = False (http://www.autoitscript.com/autoit3/docs/keywords.htm#False)

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $j = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aProcList[0][0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aProcList[$j][2] = $aRun_Processes[$i] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$bFound = True (http://www.autoitscript.com/autoit3/docs/keywords.htm#True)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $bFound Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)($aRun_Processes[$i])
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _Quit()
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _ProcessListEx($sResourceName="", $sInResString="", $iWholeWord=1)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aProcList = ProcessList (http://www.autoitscript.com/autoit3/docs/functions/ProcessList.htm)()
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $hKernel32_Dll = DllOpen (http://www.autoitscript.com/autoit3/docs/functions/DllOpen.htm)('Kernel32.dll'), $hPsapi_Dll = DllOpen (http://www.autoitscript.com/autoit3/docs/functions/DllOpen.htm)('Psapi.dll')
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aOpenProc, $aProcPath, $sFileVersion, $aRet_List[1][1]

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hKernel32_Dll = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, '')

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hPsapi_Dll = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) $hPsapi_Dll = DllOpen (http://www.autoitscript.com/autoit3/docs/functions/DllOpen.htm)(@SystemDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@systemdir) & '\Psapi.dll')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hPsapi_Dll = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) $hPsapi_Dll = DllOpen (http://www.autoitscript.com/autoit3/docs/functions/DllOpen.htm)(@WindowsDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@windowsdir) & '\Psapi.dll')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hPsapi_Dll = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(2, 0, '')

Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $vStruct = DllStructCreate (http://www.autoitscript.com/autoit3/docs/functions/DllStructCreate.htm)('int[1024]')
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $pStructPtr = DllStructGetPtr (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetPtr.htm)($vStruct)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iStructSize = DllStructGetSize (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetSize.htm)($vStruct)

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aProcList)-1
$aOpenProc = DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)($hKernel32_Dll, 'hwnd', 'OpenProcess', _
'int', BitOR (http://www.autoitscript.com/autoit3/docs/functions/BitOR.htm)(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1])

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) IsArray (http://www.autoitscript.com/autoit3/docs/functions/IsArray.htm)($aOpenProc) Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $aOpenProc[0] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)

DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)($hPsapi_Dll, 'int', 'EnumProcessModules', _
'hwnd', $aOpenProc[0], _
'ptr', $pStructPtr, _
'int', $iStructSize, _
'int*', 0)

$aProcPath = DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)($hPsapi_Dll, 'int', 'GetModuleFileNameEx', _
'hwnd', $aOpenProc[0], _
'int', DllStructGetData (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetData.htm)($vStruct, 1), _
'str', '', _
'int', 2048)

DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)($hKernel32_Dll, 'int', 'CloseHandle', 'int', $aOpenProc[0])

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) IsArray (http://www.autoitscript.com/autoit3/docs/functions/IsArray.htm)($aProcPath) Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) StringLen (http://www.autoitscript.com/autoit3/docs/functions/StringLen.htm)($aProcPath[3]) = 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)

$sFileVersion = FileGetVersion (http://www.autoitscript.com/autoit3/docs/functions/FileGetVersion.htm)($aProcPath[3], $sResourceName)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sResourceName = "" Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $sFileVersion = $sInResString Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) _
($iWholeWord = 0 And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)($sFileVersion, $sInResString)) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)

$aRet_List[0][0] += 1
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $aRet_List[$aRet_List[0][0]+1][3]
$aRet_List[$aRet_List[0][0]][0] = $aProcList[$i][0] ;Process Name
$aRet_List[$aRet_List[0][0]][1] = $aProcList[$i][1] ;PID (Process ID)
$aRet_List[$aRet_List[0][0]][2] = $aProcPath[3] ;Process File Path
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

DllClose (http://www.autoitscript.com/autoit3/docs/functions/DllClose.htm)($hKernel32_Dll)
DllClose (http://www.autoitscript.com/autoit3/docs/functions/DllClose.htm)($hPsapi_Dll)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aRet_List[0][0] < 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(3, 0, '')
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aRet_List
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

diamonster
14-07-2010, 14:00
Отлично! Спасибо, всё работает.




© OSzone.net 2001-2012