Как отследить зависание чужой программы, когда в диспетчере задач состояние "не отвечает" - VB

Узнай цену своей работы

Формулировка задачи:

Практическая значимость: перезапуск сервера.
Желательно без использования WIN.API.
Нашел на WMI, но пока не разобрал логику работы:
Листинг программы
  1. strComputer = "."
  2. Set objWMIService = GetObject("winmgmts:" _
  3. & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
  4. Set objWMIRestart = GetObject("winmgmts:" _
  5. & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2:Win32_Process")
  6. Set colMonitoredProcesses = objWMIService. _
  7. ExecNotificationQuery("select * from __InstanceDeletionEvent " _
  8. & " Within 5 Where TargetInstance isa 'Win32_Process'")
  9. Do
  10. Set objLatestProcess = colMonitoredProcesses.NextEvent
  11. If objLatestProcess.TargetInstance.Name = "GV600.exe" Then
  12. WScript.Sleep(2000)
  13. intReturn = objWMIRestart.Create("c:\GV600\GV600.exe", null, null)
  14. End If
  15. Loop
Еще нашел на языке AutoIT (там API используется):
Листинг программы
  1. $hWin = WinGetHandle('My Window')
  2.  
  3. If _WinAPI_IsHungAppWindow($hWin) Then
  4. MsgBox(48, '', 'Окно зависло')
  5. EndIf
  6.  
  7. Func _WinAPI_IsHungAppWindow($hWnd)
  8. Local $aRet = DllCall('user32.dll', 'int', 'IsHungAppWindow', 'hwnd', $hWnd)
  9.  
  10. If @error Then
  11. Return SetError(1, 0, 0)
  12. EndIf
  13.  
  14. Return $aRet[0]
  15. EndFunc
Актуально. 1. Как вообще интерпретируется понятие "зависание программы" с точки зрения низкоуровневого программирования и какие бывают причины? 2. Есть понятие "временного зависания", когда ОС не может дождаться некоторого установленного по-умолчанию тайм-аута ответа от запущенной команды. Есть ли здесь что-то общее с предыдущим пунктом? 3. По каким признакам ОС определяет, что процесс "завис" ? 4. Как наиболее просто симмитировать "зависание" своей программы?

Решение задачи: «Как отследить зависание чужой программы, когда в диспетчере задач состояние "не отвечает"»

textual
Листинг программы
  1. @echo off&:: by Alex Dragokas -05.01.13-
  2. SetLocal EnableDelayedExpansion EnableExtensions
  3. ::Name of a watching processes (separeted by ,)
  4. Set ProcNames=example.exe,example2.exe
  5. ::Set ProcNames=iw5mp_server.exe
  6. ::Delay (ms.) before the next check
  7. Set /A DelayNewCheck=5000
  8. ::Delay (ms.) before starting a process after shutting down because of "not responding" status
  9. Set DelayStartProcess=3000
  10. ::Setting Priority of Application to Run with (1 to 6):
  11. ::1 - LOW, 2 - BELOWNORMAL, 3 - NORMAL, 4 - ABOVENORMAL, 5 - HIGH, 6 - REALTIME
  12. Set Priority=3
  13. ::Start the process in Minimize mode? (1 - Yes, 2 - No)
  14. Set Minimize=1
  15.  
  16. ::The time (ms.) while we checking if a process really not responding all this time
  17. Set /A BugTime=10000
  18. ::How many times we make a series of chekings (during %BugTime%)
  19. Set /A BugChecks=10
  20.  
  21. Set /A BugIntervals=%BugChecks% - 1
  22. Set /A BugIntervalsDelay=%BugTime% / %BugIntervals%
  23. Call :PriorityEnum %Priority% Priority
  24. if %Minimize%==1 (set Minimize=/MIN ) else (set Minimize=)
  25. Set ProcNames="%ProcNames:,=" "%"
  26.  
  27. :begin
  28. For %%A in (%ProcNames%) do call :WatchSingleProcess "%%~A"
  29. Call :Delay %DelayNewCheck%
  30. Goto :begin
  31.  
  32.  
  33. :WatchSingleProcess %1-Name_of_Process
  34. Set Process=%~1
  35. Call :IsResponding "%Process%"
  36. Set PID=%errorlevel%
  37. if %PID% neq 0 (
  38.   <nul set /p test=Found Bug in "%Process%" PID=%PID%
  39.   for /L %%C in (1,1,%BugChecks%) do (
  40.     Call :IsResponding "%Process%"
  41.     if !errorlevel! neq 0 (
  42.         <nul set /p test=.
  43.         if %%C==%BugChecks% (Call :Restart "%PID%" "%Process%"& Exit /B)
  44.         Call :Delay %BugIntervalsDelay%
  45.       ) else (
  46.         Echo Waked up
  47.         Exit /B
  48.     )
  49.   )
  50. )
  51. Exit /B
  52.  
  53.  
  54. :Delay %1-msec.
  55. ping 192.168.254.254 -n 2 -w %~1 > nul
  56. Exit /B
  57.  
  58. :IsResponding %1-ProcessName
  59. For /f "tokens=1,2 delims=," %%A in (
  60.   'tasklist /FI "IMAGENAME eq %~1" /FI "STATUS eq NOT RESPONDING" /FO CSV /NH') do (
  61.     if /i "%%~A"=="%~1" Exit /B %%~B
  62. )
  63. Exit /B 0
  64.  
  65. :Restart %1-Proccess_PID %2-Process_Name
  66. Echo ShutDown
  67. ::Getting the Process' FullName (with Path)
  68. for /f "tokens=2 delims==" %%A in (
  69.  'wmic path win32_process where ^(ProcessID^=%~1 and name^="%~2"^) get "CommandLine" /value^|find "CommandLine"'
  70. ) do (Set ProcessFullName=%%A)
  71.  
  72. taskkill /F /PID %~1
  73. Call :Delay %DelayStartProcess%
  74. start "" %Minimize%/%Priority% %ProcessFullName%
  75. Echo %ProcessFullName% started successfully.
  76. Exit /B
  77.  
  78. :PriorityEnum %1-Constant %2-var.name
  79. if %~1==1 Set %~2=LOW
  80. if %~1==2 Set %~2=BELOWNORMAL
  81. if %~1==3 Set %~2=NORMAL
  82. if %~1==4 Set %~2=ABOVENORMAL
  83. if %~1==5 Set %~2=HIGH
  84. if %~1==6 Set %~2=REALTIME
  85. Exit /B

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы