Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/76: Рейтинг темы: голосов - 76, средняя оценка - 4.59
Pomaxa
0 / 0 / 0
Регистрация: 19.01.2016
1

Отслеживание зависания (состояния "не отвечает") программы и её перезапуск

21.01.2013, 19:05. Просмотров 13653. Ответов 90
Метки нет (Все метки)

Dragokas, благодарю за программку, как раз то, что нужно для моих целей!

Единственный вопрос, что нужно дописать в вашу программку, чтобы после перезапуска зависшего приложения спустя заданное время в миллисекундах, программа имитировала нажатие клавиши Enter для перезапущенного приложения и через 2 секунды (например) "нажимала" Enter сново, для запущенного приложения. И чтобы второй Enter, при необходимости можно было отключить. И первый тоже, при необходимости, отключить можно было.

Просто программа, которую я отслеживаю, благодаря вашей программке, при запуске выдает диалоговое окно, в котором нужно нажать Enter. И только после закрытия данного диалогового окна программа начинает выполнять действия. Программа работает круглосуточно и автоматизация закрытия диалогового окна была бы очень актуальна.

Если вас не затруднит, помогите улучшить вашу программку, думаю эта дополнительная функция будет полезна не только мне.

Еще раз благодарю за данную программку, ибо хотел писать ее сам, но вовремя увидел ваш труд.

 Комментарий модератора 
Комментарий:
Оригинальный код находится в теме: Полезные BAT/CMD скрипты
Дополнительные варианты решений на других языках расположены в разделе: Visual Basic
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2013, 19:05
Ответы с готовыми решениями:

Избавиться от сообщений "Файл не найден", "Системе не удается найти указанный путь", "Устройство не готово"
Здравствуйте. В батнике присутствует поиск файлов: for %%i in (c d e f g h i j k l m n o p q r s t...

Отслеживание состояния "NumLock" или глобальный хук клавиатуры
Здравствуйте! Нужно по нажатию NumLock выводить окно программы. Что предпочтительнее, отслеживать...

При автозапуске программы через реестр программа "не отвечает"
Доброго времени. Добавил свою программу в автозапуск в реестре. Программа сама скрытая (это такая...

Как отследить зависание чужой программы, когда в диспетчере задач состояние "не отвечает"
Практическая значимость: перезапуск сервера. Добавлено через 5 минут Желательно без...

Отслеживание "прекращена работа программы"
Доброго времени суток, формучане \\//. Помогите, пожалуйста, решить задачу: необходимо написать...

90
Dragokas
Эксперт WindowsАвтор FAQ
17080 / 7135 / 861
Регистрация: 25.12.2011
Сообщений: 10,939
Записей в блоге: 16
21.01.2013, 20:34 2
Наиболее оптимально я бы посоветовал воспользоваться VBS-скриптом

параметр 1 - имя программы
параметр 2 - ожидание (в мс.) перед нажатием клавиши Enter (опционально)

Sendkey.vbs
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'1-th parameter is a name of your program
'2-th parameter is optional (count of msec. to wait)
Set objArgs = wscript.Arguments
If objArgs.Count = 0 then WScript.Echo "This Script cannot be run witout parameters"
 
Set WShell = CreateObject("WScript.Shell")
'Run the program
Set WshExec = WShell.Exec(objArgs(0))
'Waiting
If objArgs.Count = 2 then WScript.Sleep(objArgs(1))
'Activate the program's window
WShell.AppActivate(WshExec.ProcessID)
'Little bit waiting for activation processed
WScript.Sleep(500)
'Sending keys
Wshell.sendKeys "{ENTER}"
Пример вызова:

Bash
1
cscript //nologo Sendkey.vbs program.exe 5000
Замените этой частью строку возобновления процесса в моем моего BAT-е.
2
score4fun
8 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 2
03.02.2014, 10:34 3
Скрипт чоткий, вот только мелкожидкие малость каряво перевели команды, таким образом в русской версии вендов скрипт не работает..
гуглю
0
Dragokas
Эксперт WindowsАвтор FAQ
17080 / 7135 / 861
Регистрация: 25.12.2011
Сообщений: 10,939
Записей в блоге: 16
03.02.2014, 22:07 4
score4fun, по-подробнее... Что, как запускаете, на чем тестите, какие настройки.
Должно работать на всех версиях, начиная с XP.
0
03.02.2014, 22:07
WooFi
8 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
04.02.2014, 15:33 5
score4fun, с кодировкой может быть проблемы?
0
score4fun
8 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 2
04.02.2014, 15:59 6
Dragokas, запускал на вин7 х64 - воркает, но нужно, чтобы так же воркало и на винХР СП3 рус, там не хочет... разгуглил, говорят, что в русской локализации тасклист не совсем корректно пашет, а именно фильтры, при этом у тасккилла таких проблем нет
0
Nice-L
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 2
15.03.2014, 07:13 7
Привет. В поиске решения своей проблемы наткнулся на код от Alex Dragokas и этот код очень оказался бы полезным в решении проблемы если бы позволил запускать другой процесс с определенными аргументами. Объясню: запускается процесс primer1.exe c аргументами /a /b /c при этом этот процесс активирует модуль primer2.res который выполняет основные действия и бывает зависает. Я не так силен в программировании как вы, возможно проблема в этом участке кода:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:Restart %1-Proccess_PID %2-Process_Name
Echo ShutDown
Call :GetProcessInfo "%~1" "%~2" ProcessPath Param
taskkill /F /PID %~1
Call :Delay %DelayStartProcess%
pushd "%ProcessPath%"
start "" %Minimize%/%Priority% "%ProcessPath%\%~2" %Param%
popd
Echo %ProcessFullName% started.
::Delay before minimize by NirCMD utility
Call :Delay 3000
if defined WinTitle nircmd win min ititle "%WinTitle%"
if defined WinClass nircmd win min class "%WinClass%"
Call :Delay %MemDelay%
if defined MinMemory (
  tasklist /FI "IMAGENAME eq %~2" /FI "PID eq %~1" /FI "MEMUSAGE lt %MemDelay%" /FO CSV /NH|Find /i "%~2"&&(
    Call :Restart "%~1" "%~2"
Как переделать этот участок кода так чтобы в случае зависания процесса primer2.res, он завершался и запускался primer1.exe с аргументами /a /b /c ?
пока что весь код в таком виде:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
@echo off&:: by Alex Dragokas -05.01.13-
SetLocal EnableDelayedExpansion EnableExtensions
::Name of a watching processes (separeted by ,)
Set ProcNames=primer1.exe,primer2.res
::Delay (ms.) before the next check
Set /A DelayNewCheck=5000
::Delay (ms.) before starting a process after shutting down because of "not responding" status
Set DelayStartProcess=3000
::Setting Priority of Application to Run with (1 to 6):
::1 - LOW, 2 - BELOWNORMAL, 3 - NORMAL, 4 - ABOVENORMAL, 5 - HIGH, 6 - REALTIME
Set Priority=3
::Start the process in Minimize mode? (1 - Yes, 2 - No)
Set Minimize=2
::Delay (ms.) before checking for using of memory
::Set MemDelay=10000
::Count of bytes that application need to use after 3 + %MemDelay% ms. of new running.
::Set MinMemory=200000000
 
::ForceMinimizeOptions (with NirCMD utility). Recognizing by class or title of window (or part of it)
::Set WinClass=IW5 WinConsole
::Set WinTitle=Call of Duty
 
::The time (ms.) while we checking if a process really not responding all this time
Set /A BugTime=10000
::How many times we make a series of chekings (during %BugTime%)
Set /A BugChecks=10
 
Set /A BugIntervals=%BugChecks% - 1
Set /A BugIntervalsDelay=%BugTime% / %BugIntervals%
Call :PriorityEnum %Priority% Priority
if %Minimize%==1 (set Minimize=/MIN ) else (set Minimize=)
Set ProcNames="%ProcNames:,=" "%"
 
:begin
For %%A in (%ProcNames%) do call :WatchSingleProcess "%%~A"
Call :Delay %DelayNewCheck%
Goto :begin
 
 
:WatchSingleProcess %1-Name_of_Process
Set Process=%~1
Call :IsResponding "%Process%"
Set PID=%errorlevel%
if %PID% neq 0 (
  Call :GetProcessInfo "%PID%" "%Process%" ProcessPath Param
  <nul set /p test=Found Bug in %Process% PID=%PID% %ProcessPath% 
  for /L %%C in (1,1,%BugChecks%) do (
    Call :IsResponding "%Process%"
    if !errorlevel! neq 0 (
        <nul set /p test=.
        if %%C==%BugChecks% (Call :Restart "%PID%" "%Process%"& Exit /B)
        Call :Delay %BugIntervalsDelay%
      ) else (
        Echo Waked up
        Exit /B
    )
  )
)
Exit /B
 
 
:Delay %1-msec.
if "%1"=="" Exit /B
ping 192.168.254.254 -n 2 -w %~1 > nul
Exit /B
 
:IsResponding %1-ProcessName
For /f "tokens=1,2 delims=," %%A in (
  'tasklist /FI "IMAGENAME eq %~1" /FI "STATUS eq NOT RESPONDING" /FO CSV /NH') do (
    if /i "%%~A"=="%~1" Exit /B %%~B
)
Exit /B 0
 
:Restart %1-Proccess_PID %2-Process_Name
Echo ShutDown
Call :GetProcessInfo "%~1" "%~2" ProcessPath Param
taskkill /F /PID %~1
Call :Delay %DelayStartProcess%
pushd "%ProcessPath%"
start "" %Minimize%/%Priority% "%ProcessPath%\%~2" %Param%
popd
Echo %ProcessFullName% started.
::Delay before minimize by NirCMD utility
Call :Delay 3000
if defined WinTitle nircmd win min ititle "%WinTitle%"
if defined WinClass nircmd win min class "%WinClass%"
Call :Delay %MemDelay%
if defined MinMemory (
  tasklist /FI "IMAGENAME eq %~2" /FI "PID eq %~1" /FI "MEMUSAGE lt %MemDelay%" /FO CSV /NH|Find /i "%~2"&&(
    Call :Restart "%~1" "%~2"
))
Exit /B
 
:PriorityEnum %1-Constant %2-var.name
if %~1==1 Set %~2=LOW
if %~1==2 Set %~2=BELOWNORMAL
if %~1==3 Set %~2=NORMAL
if %~1==4 Set %~2=ABOVENORMAL
if %~1==5 Set %~2=HIGH
if %~1==6 Set %~2=REALTIME
Exit /B
 
:GetProcessInfo %1-Proccess_PID %2-Process_Name %3-var.Process_Path %4-var.Process_Parameters
::Getting the Process' Path and Parameters
for /f "tokens=1* delims==" %%A in (
  'wmic path win32_process where ^(ProcessID^=%~1 and name^="%~2"^) get "CommandLine"^,"ExecutablePath" /value^|findstr /BC:"CommandLine" /C:"ExecutablePath"') do (
  if "%%A"=="CommandLine" Set ProcParse=%%B
  if "%%A"=="ExecutablePath" Set ProcessPath=%%~dpB
)
Set %3=%ProcessPath:~0,-1%
::Parse Parameters
Set /A n=0& Set Param=
for %%A in (%ProcParse%) do Set /A n+=1& if !n! neq 1 (Set Param=!Param!%%A )
Set %4=%Param:~0,-1%
Exit /B
0
WooFi
8 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
15.03.2014, 08:06 8
Я создал ярлык для запускаемой программы с нужными параметрами, обозвал Robot.lnk
Добавил переменную
Windows Batch file
1
Set ProcessFullName=C:\bat\Proverka_robota\Robot.lnk
и изменил старт процесса
Windows Batch file
1
start "" %Minimize%/%Priority% %ProcessFullName%
Батник делал для проверки зависания 1С-ки, при ФТП обмене при обрыве связи зависает наглухо. Поставил проверку зависания примерно в течении 15 минут, если висит то перезапускает его. Плюс пишет время зависания и перезапуска процесса в лог файл и отправляет его на FTP-serv.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
@echo off
echo ProverkaRobota zapushena
SetLocal EnableDelayedExpansion EnableExtensions
::Name of a watching processes (separeted by ,)
Set ProcNames=example.exe,1cv8.exe
Set ProcessFullName=C:\bat\Proverka_robota\Robot.lnk
::Delay (ms.) before the next check
Set /A DelayNewCheck=10000
::Delay (ms.) before starting a process after shutting down because of "not responding" status
Set DelayStartProcess=5000
::Setting Priority of Application to Run with (1 to 6):
::1 - LOW, 2 - BELOWNORMAL, 3 - NORMAL, 4 - ABOVENORMAL, 5 - HIGH, 6 - REALTIME
Set Priority=3
::Start the process in Minimize mode? (1 - Yes, 2 - No)
Set Minimize=2
::The time (ms.) while we checking if a process really not responding all this time 700000
Set /A BugTime=300000
::How many times we make a series of chekings (during %BugTime%) 10 
Set /A BugChecks=10
 
Set /A BugIntervals=%BugChecks% - 1
Set /A BugIntervalsDelay=%BugTime% / %BugIntervals%
Call :PriorityEnum %Priority% Priority
if %Minimize%==1 (set Minimize=/MIN ) else (set Minimize=)
Set ProcNames="%ProcNames:,=" "%"
 
:begin
For %%A in (%ProcNames%) do call :WatchSingleProcess "%%~A"
Call :Delay %DelayNewCheck%
Goto :begin
 
 
:WatchSingleProcess %1-Name_of_Process
Set Process=%~1
Call :IsResponding "%Process%"
Set PID=%errorlevel%
if %PID% neq 0 (
  <nul set /p test=Found Bug in "%Process%" PID=%PID%
  for /L %%C in (1,1,%BugChecks%) do (
    Call :IsResponding "%Process%"
    if !errorlevel! neq 0 (
        <nul set /p test=.
        if %%C==%BugChecks% (Call :Restart "%PID%" "%Process%"& Exit /B)
        Call :Delay %BugIntervalsDelay%
      ) else (
        Echo Waked up
        Exit /B
    )
  )
)
Exit /B
 
 
:Delay %1-msec.
ping 192.168.254.254 -n 2 -w %~1 > nul
Exit /B
 
:IsResponding %1-ProcessName
For /f "tokens=1,2 delims=," %%A in (
  'tasklist /FI "IMAGENAME eq %~1" /FI "STATUS eq NOT RESPONDING" /FO CSV /NH') do (
    if /i "%%~A"=="%~1" Exit /B %%~B
)
Exit /B 0
 
:Restart %1-Proccess_PID %2-Process_Name
Echo ShutDown
md "c:/bat/Proverka_robota/log"
echo %date% %time% robot povis >>"log\%COMPUTERNAME%_%PROCESSOR_REVISION%_%USERNAME%.txt"
ftp -s:ftpcmd.dat
::Getting the Process' FullName (with Path)
::for /f "tokens=2 delims==" %%A in (
::  'wmic path win32_process where ^(ProcessID^=%~1 and name^="%~2"^) get "CommandLine" /value^|find "CommandLine"'
::) do (Set ProcessFullName=%%A)
 
taskkill /F /PID %~1
Call :Delay %DelayStartProcess%
start "" %Minimize%/%Priority% %ProcessFullName%
Echo %ProcessFullName% started successfully.
md "c:/bat/Proverka_robota/log"
echo %date% %time% robot zapushen >>"log\%COMPUTERNAME%_%PROCESSOR_REVISION%_%USERNAME%.txt"
ftp -s:ftpcmd.dat
Exit /B
 
:PriorityEnum %1-Constant %2-var.name
if %~1==1 Set %~2=LOW
if %~1==2 Set %~2=BELOWNORMAL
if %~1==3 Set %~2=NORMAL
if %~1==4 Set %~2=ABOVENORMAL
if %~1==5 Set %~2=HIGH
if %~1==6 Set %~2=REALTIME
Exit /B
0
Яхья
0 / 0 / 0
Регистрация: 13.08.2015
Сообщений: 1
13.08.2015, 14:35 9
WooFi, привет! у меня такая проблема, 1с подвисает, я искал скрин с расширением bat, чтобы он автоматически завершал подвисший 1с и по новой запускал., я нашел твой скрин, но я так понимаю, что мне нужно ставить свой путь для запуска моей 1с-ки ) если да, то подскажи куда именно можно вставить путь запуска проги.... спс
0
WooFi
8 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
14.08.2015, 07:37 10
Windows Batch file
6
Set ProcessFullName=C:\bat\Proverka_robota\Robot.lnk
Тут путь до ярлыка запуска 1С-ки.
Внутренности ярлыка например такие для файловой базы:
Код
"C:\Program Files\1cv82\8.2.18.102\bin\1cv8.exe" enterprise /f"D:\1C_BASE_Mag50" /nЛОГИН /pПАРОЛЬ
0
oniava
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 85
30.10.2015, 05:45 11
Здравствуйте.
На днях столкнулся с Вашим скриптом Responding3_for_forum.bat.
Очень удобная и полезная вещь, за что Вам отдельное СПАСИБО.

Сейчас использую его совместно со своей программой и здорово выручает.
Но только столкнулся с проблемой, если моё приложение зависает, то Ваш скрипт его перезапускает с легкостью.
Но если происходит "вылет" моего приложения (само по себе закрывается), то Ваш скрипт в данном случае бессилен.

Как сделать так, что бы скрипт еще и контролировал сам процесс.
Т.е. если процесс "исчез", то скрипт его сново запускает.

Еще раз спасибо за Вашу работу.
0
WooFi
8 / 0 / 0
Регистрация: 10.01.2014
Сообщений: 4
30.10.2015, 07:17 12
Использую такой скрипт, запускается планировщиком каждые полчаса.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@echo off
setlocal ENABLEDELAYEDEXPANSION
Set Process=1cv8
tasklist | Find /i "%Process%.exe" || (goto Else)
:THEN
echo ProverkaRobota zapushena
exit
Goto end
:ELSE
"C:\bat\Proverka_robota\Robot.lnk"
echo zapusk 1C
Ну и соответственно для себя меняете:
  • Set Process=1cv8 - наблюдаемый процесс
  • "C:\bat\Proverka_robota\Robot.lnk" - путь к запуску приложения
0
oniava
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 85
30.10.2015, 15:08 13
Здравствуйте.

А как можно вставить в уже готовый в батник Ваши действия по проверке "Пропавшего" процесса?
У меня просто круглосуточно запущен он...

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
@echo off&:: by Alex Dragokas -05.01.13-
SetLocal EnableDelayedExpansion EnableExtensions
::Name of a watching processes (separeted by ,)
Set ProcNames=example.exe,example2.exe
::Delay (ms.) before the next check
Set /A DelayNewCheck=5000
::Delay (ms.) before starting a process after shutting down because of "not responding" status
Set DelayStartProcess=3000
::Setting Priority of Application to Run with (1 to 6):
::1 - LOW, 2 - BELOWNORMAL, 3 - NORMAL, 4 - ABOVENORMAL, 5 - HIGH, 6 - REALTIME
Set Priority=3
::Start the process in Minimize mode? (1 - Yes, 2 - No)
Set Minimize=1
::Delay (ms.) before checking for using of memory
::Set MemDelay=10000
::Count of bytes that application need to use after 3 + %MemDelay% ms. of new running.
::Set MinMemory=200000000
 
::ForceMinimizeOptions (with NirCMD utility). Recognizing by class or title of window (or part of it)
::Set WinClass=IW5 WinConsole
::Set WinTitle=Call of Duty
 
::The time (ms.) while we checking if a process really not responding all this time
Set /A BugTime=10000
::How many times we make a series of chekings (during %BugTime%)
Set /A BugChecks=10
 
Set /A BugIntervals=%BugChecks% - 1
Set /A BugIntervalsDelay=%BugTime% / %BugIntervals%
Call :PriorityEnum %Priority% Priority
if %Minimize%==1 (set Minimize=/MIN ) else (set Minimize=)
Set ProcNames="%ProcNames:,=" "%"
 
:begin
For %%A in (%ProcNames%) do call :WatchSingleProcess "%%~A"
Call :Delay %DelayNewCheck%
Goto :begin
 
 
:WatchSingleProcess %1-Name_of_Process
Set Process=%~1
Call :IsResponding "%Process%"
Set PID=%errorlevel%
if %PID% neq 0 (
  Call :GetProcessInfo "%PID%" "%Process%" ProcessPath Param
  <nul set /p test=Found Bug in %Process% PID=%PID% %ProcessPath% 
  for /L %%C in (1,1,%BugChecks%) do (
    Call :IsResponding "%Process%"
    if !errorlevel! neq 0 (
        <nul set /p test=.
        if %%C==%BugChecks% (Call :Restart "%PID%" "%Process%"& Exit /B)
        Call :Delay %BugIntervalsDelay%
      ) else (
        Echo Waked up
        Exit /B
    )
  )
)
Exit /B
 
 
:Delay %1-msec.
if "%1"=="" Exit /B
ping 192.168.254.254 -n 2 -w %~1 > nul
Exit /B
 
:IsResponding %1-ProcessName
For /f "tokens=1,2 delims=," %%A in (
  'tasklist /FI "IMAGENAME eq %~1" /FI "STATUS eq NOT RESPONDING" /FO CSV /NH') do (
    if /i "%%~A"=="%~1" Exit /B %%~B
)
Exit /B 0
 
:Restart %1-Proccess_PID %2-Process_Name
Echo ShutDown
Call :GetProcessInfo "%~1" "%~2" ProcessPath Param
taskkill /F /PID %~1
Call :Delay %DelayStartProcess%
pushd "%ProcessPath%"
start "" %Minimize%/%Priority% "%ProcessPath%\%~2" %Param%
popd
Echo %ProcessFullName% started.
::Delay before minimize by NirCMD utility
Call :Delay 3000
if defined WinTitle nircmd win min ititle "%WinTitle%"
if defined WinClass nircmd win min class "%WinClass%"
Call :Delay %MemDelay%
if defined MinMemory (
  tasklist /FI "IMAGENAME eq %~2" /FI "PID eq %~1" /FI "MEMUSAGE lt %MemDelay%" /FO CSV /NH|Find /i "%~2"&&(
    Call :Restart "%~1" "%~2"
))
Exit /B
 
:PriorityEnum %1-Constant %2-var.name
if %~1==1 Set %~2=LOW
if %~1==2 Set %~2=BELOWNORMAL
if %~1==3 Set %~2=NORMAL
if %~1==4 Set %~2=ABOVENORMAL
if %~1==5 Set %~2=HIGH
if %~1==6 Set %~2=REALTIME
Exit /B
 
:GetProcessInfo %1-Proccess_PID %2-Process_Name %3-var.Process_Path %4-var.Process_Parameters
::Getting the Process' Path and Parameters
for /f "tokens=1* delims==" %%A in (
  'wmic path win32_process where ^(ProcessID^=%~1 and name^="%~2"^) get "CommandLine"^,"ExecutablePath" /value^|findstr /BC:"CommandLine" /C:"ExecutablePath"') do (
  if "%%A"=="CommandLine" Set ProcParse=%%B
  if "%%A"=="ExecutablePath" Set ProcessPath=%%~dpB
)
Set %3=%ProcessPath:~0,-1%
::Parse Parameters
Set /A n=0& Set Param=
for %%A in (%ProcParse%) do Set /A n+=1& if !n! neq 1 (Set Param=!Param!%%A )
Set %4=%Param:~0,-1%
Exit /B
Responding3_for_forum.rar
0
Dragokas
Эксперт WindowsАвтор FAQ
17080 / 7135 / 861
Регистрация: 25.12.2011
Сообщений: 10,939
Записей в блоге: 16
30.10.2015, 22:01 14
oniava, тот давно устарел, через год обновлял, но никуда не выкладывал.
Вот, вытащил с сервера, чуть почистил.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
@echo off&:: by Alex Dragokas -05.01.13-
COLOR 07
 
:: Start all proccesses, kill not responding proccesses, kill proccess less then defined number of MB RAM.
SetLocal EnableDelayedExpansion EnableExtensions
 
Echo.& Echo.
Echo Monitor has been started.&Echo.
 
::Path to process
Set Path1=l:\Bash\Not Responding\1\test.exe
Set Path2=l:\Bash\Not Responding\2\test2.exe
 
::Parameters for the server
Set Args1=+set sv_config server_1.cfg
Set Args2=+set sv_config server_2.cfg
 
::Delay (sec.) before the next check
Set /A DelayNewCheck=6
 
::Delay (sec.) before starting a process after shutting down because of "not responding" status
Set DelayStartProcess=4
 
::Setting Priority of Application to Run with (1 to 6):
::1 - LOW, 2 - BELOWNORMAL, 3 - NORMAL, 4 - ABOVENORMAL, 5 - HIGH, 6 - REALTIME
Set Priority=3
 
::Start the process in Minimize mode? (1 - Yes, 2 - No)
Set Minimize=2
 
::Count of Memory Checks before closing the application
Set MemoryChecks=10
 
::Set Delay before each memory check (sec.)
Set MemoryDelay=3
 
::Count of KBytes that application need to use after 3 + %MemDelay% sec. of new launchings.
Set MinMemory=1000
 
::How many times we make a series of chekings (during %BugTime%)
Set /A BugChecks=12
 
::Set Delay for each bug check (ms.)
Set BugCheckDelay=3
 
 
 
Call :PriorityEnum %Priority% Priority
if %Minimize%==1 (set Minimize=/MIN ) else (set Minimize=)
 
:begin
for /L %%X in (1,1,20) do if Defined Path%%X For %%A in ("!Path%%X!") do call :WatchSingleProcess "%%~nxA"
Call :Delay %DelayNewCheck%
Goto :begin
 
 
:WatchSingleProcess %1-Name_of_Process
Set Process=%~1
Set PID=
Call :IsResponding "%Process%"
Set PID=%errorlevel%
if "%PID%" neq "0" (
  Call :GetProcessInfo "%PID%" "%Process%" ProcessPath Param
  set HH=!time:~0,2!
  Set MM=!time:~-8,2!
  Set SS=!time:~-5,2!
  if "!HH:~0,1!"==" " set HH=0!HH:~1,1!
  Set myTime=!HH!:!MM!
  Echo %DATE%   !myTime!
  <nul set /p "test=Found Bug in %Process% PID=%PID% %ProcessPath%" 
  for /L %%C in (1,1,%BugChecks%) do (
    Call :IsResponding "%Process%" "%PID%"
    if !errorlevel! neq 0 (
        <nul set /p test=.
        if %%C==%BugChecks% (Call :Restart "%PID%" "%Process%"& Exit /B)
        Call :Delay %BugCheckDelay%
      ) else (
        Echo Waked up
        Goto :MemoryCheckLabel
    )
  )
)
:MemoryCheckLabel
Set PID=
Call :CheckMemory "%Process%"
Set PID=%errorlevel%
if "%PID%" neq "0" (
  Call :GetProcessInfo "%PID%" "%Process%" ProcessPath Param
  rem <nul set /p test=
  set HH=!time:~0,2!
  Set MM=!time:~-8,2!
  Set SS=!time:~-5,2!
  if "!HH:~0,1!"==" " set HH=0!HH:~1,1!
  Set myTime=!HH!:!MM!
  Echo.
  Echo !DATE!   !myTime!
  Echo Found low memory loading in %Process% PID=%PID% %ProcessPath% 
  for /L %%C in (1,1,%MemoryChecks%) do (
    Call :CheckMemory "%Process%" "%PID%"
    if !errorlevel! neq 0 (
        rem <nul set /p test=.
        if %%C==%MemoryChecks% (Call :Restart "%PID%" "%Process%"& Exit /B)
        Call :Delay %MemoryDelay%
      ) else (
        Echo Memory ok
        Exit /B
    )
  )
)
:IsAllProcessRunned
::Get path for all runned iw5mp_server processes
for /L %%X in (1,1,20) do (
  if Defined Path%%X (
    for /f "tokens=1* delims==" %%A in (
      'wmic path win32_process where ExecutablePath^="!Path%%X:\=\\!" get name /value 2^>^&1^|find /i "No Instance"') do (
         Call :StartServer "!Path%%X!" "!Args%%X!"
    )
  )
)
call :Delay 1
exit /B
 
:IsResponding %1-ProcessName %2-Optional_PID
::Set PID Filter when we enter the bug-awaiting stady
Set PID_Filter=
if "%~2" neq "" Set PID_Filter= /FI "PID eq %~2"
For /f "tokens=1,2 delims=," %%A in (
  'tasklist /FI "IMAGENAME eq %~1"%PID_Filter% /FI "STATUS eq NOT RESPONDING" /FO CSV /NH') do (
    if /i "%%~A"=="%~1" Exit /B %%~B
)
Exit /B 0
 
:Restart %1-Proccess_PID %2-Process_Name
Call :GetProcessInfo "%~1" "%~2" ProcessPath Param
taskkill /T /F /PID %~1
Echo ShutDown Server PID=%~1
Call :Delay %DelayStartProcess%
if "%ProcessPath%" neq "" Call :StartServer "%ProcessPath%\%~2" "%Param%"
Exit /B
 
:StartServer %1-ProcessPath %2-Param
For %%A in ("%~1") do start "" /d "%%~dpA" %Minimize%/%Priority% "%~1" %~2
Echo.
Echo %DATE% %TIME%
Echo %~1 %~2 started.
exit /B
 
:CheckMemory %1-Process_Name %2-Proccess_PID-Optional
::Set PID Filter when we enter the bug-awaiting stady
Set PID_Filter=
if "%~2" neq "" Set PID_Filter= /FI "PID eq %~2"
For /f "tokens=1,2,3,4* delims=," %%A in (
  'tasklist /FI "IMAGENAME eq %~1"%PID_Filter% /FI "MEMUSAGE lt %MinMemory%" /FO CSV /NH') do (
    if /i "%%~A"=="%~1" (
      if "%~2" neq "" (Echo PID=%~2 Memory=%%E) else (Echo Begin Check PID=%%~B Memory=%%E)
      Exit /B %%~B
    )
)
Exit /B 0
 
:PriorityEnum %1-Constant %2-var.name
if %~1==1 Set %~2=LOW
if %~1==2 Set %~2=BELOWNORMAL
if %~1==3 Set %~2=NORMAL
if %~1==4 Set %~2=ABOVENORMAL
if %~1==5 Set %~2=HIGH
if %~1==6 Set %~2=REALTIME
Exit /B
 
:GetProcessInfo %1-Proccess_PID %2-Process_Name %3-var.Process_Path %4-var.Process_Parameters
set %~3=
::Getting the Process' Path and Parameters
for /f "tokens=1* delims==" %%A in (
  'wmic path win32_process where ^(ProcessID^=%~1 and name^="%~2"^) get "CommandLine"^,"ExecutablePath" /value^|findstr /BC:"CommandLine" /C:"ExecutablePath"') do (
  if "%%A"=="CommandLine" Set "ProcParse=%%B"
  if "%%A"=="ExecutablePath" Set "ProcessPath=%%~dpB"
)
if "%ProcessPath%" neq "" Set "%3=%ProcessPath:~0,-1%"
::Parse Parameters
Set /A n=0& Set Param=
for %%A in (%ProcParse%) do Set /A n+=1& if !n! neq 1 (Set "Param=!Param!%%A ")
Set "%4=%Param:~0,-1%"
Exit /B
 
:Delay %1-sec.
ping 127.1 -n %~1 > nul
Exit /B
2
oniava
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 85
30.10.2015, 22:02 15
А какие в нем изменения?
0
Dragokas
Эксперт WindowsАвтор FAQ
17080 / 7135 / 861
Регистрация: 25.12.2011
Сообщений: 10,939
Записей в блоге: 16
30.10.2015, 22:02 16
Программа натравки скрипта.
0
Вложения
Тип файла: rar test.rar (2.4 Кб, 53 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
17080 / 7135 / 861
Регистрация: 25.12.2011
Сообщений: 10,939
Записей в блоге: 16
30.10.2015, 22:05 17
oniava, исправлены баги,
добавлена возможность следить за несколькими процессами (каждому можно задать свои аргументы запуска),
добавлена возможность тушить процессы, которые не набрали достоточного кол-ва ОЗУ (переменная MinMemory),
время в консоль, больше визуализации.
0
oniava
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 85
30.10.2015, 22:07 18
Отслеживание зависания (состояния "не отвечает") программы и её перезапуск

Не работает.
0
Dragokas
Эксперт WindowsАвтор FAQ
17080 / 7135 / 861
Регистрация: 25.12.2011
Сообщений: 10,939
Записей в блоге: 16
30.10.2015, 22:28 19
Читайте, что написано.

Добавлено через 44 секунды
Как же оно будет работать, если Вы не подстроили под себя.
0
oniava
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 85
30.10.2015, 22:30 20
Разобрался Алекс.
Вопросик один остался, где и как дописать, что бы перед новым запуском приложения, сначала удалялись строки из файла links_skipped.txt, а уже потом запускалось приложение.

И будет просто супер!!!
0
30.10.2015, 22:30
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2015, 22:30

Почему "не отвечает" программа при выполнении "in"?
Почему у меня программа вылетает если я выполняю &quot;in&quot; на 60h порт? Пробовал программу запустить...

Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "."
Не могу ни как собразить как написать регулярное выражение для выдергивания английских букв и...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru