Показать полную графическую версию : Остановка службы при запуске определенного процесса и запуск после его завершения.
Kukuruzo666
10-02-2018, 03:34
К примеру служба носит название "1", а процесс "2". Служба работает, а процесс не запущен. Как только процесс запустился, служба сразу останавливается, а как только он завершился, служба сразу запускается.
@echo off
set "proc=process.exe"
set "serv=service"
cmd /c for /l %%i in () do @tasklist /fi "imagename eq %proc%"^|findstr /v :^&^& (sc stop "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
cmd /c for /l %%i in () do @tasklist /fi "imagename eq %proc%"^|findstr /v :^|^| (sc start "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
pause
Kukuruzo666
10-02-2018, 14:58
Спасибо большое, все работает =) Только net вместо sc поставить нужно.
Kukuruzo666
17-03-2018, 11:28
А можно узнать как сделать так, чтоб мониторились не один, а несколько процессов и при появлении одного из этих процессов сначала завершался определенный процесс, а уже потом останавливалась служба?
по идее как-то так:
@echo off
set "proc=process.exe"
set "serv=service"
cmd /c for /l %%i in () do @for %%p in (proc1 proc2 proc3) do @tasklist /fi "imagename eq %%p"^|findstr /v :^&^& (taskkill /f /im "%proc%"^& sc stop "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
pause
Kukuruzo666
19-03-2018, 05:31
Работает, спасибо :) Можно сделать чтоб при закрытии одного из процессов запускалась служба? Так пытался сделать, не получилось :( Запускается в любом случае.
set "proc=process.exe"
set "serv=service"
cmd /c for /l %%i in () do @for %%p in (proc1 proc2 proc3) do @tasklist /fi "imagename eq %%p"^|findstr /v :^&^& (taskkill /f /im "%proc%"^& net stop "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
cmd /c for /l %%i in () do @for %%p in (proc1 proc2 proc3) do @tasklist /fi "imagename eq %%p"^|findstr /v :^|^| (net start "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
pause
Kukuruzo666,
проверил такой строкой на живом примере
cmd /c for /l %%i in () do @for %%p in (xnview.exe calc.exe) do @tasklist /fi "imagename eq %%p"^|findstr /v :^|^| (echo Запуск^& exit /b)^&^>nul timeout /t 1 /nobreak
при запущенных процессах xnview.exe calc.exe вижу true вывод tasklist, как и положено, а при закрытии любого процесса, вывод строки echo Запуск
так что смотрите что делаете не так
Kukuruzo666
20-03-2018, 13:30
Понял почему не работало. Сразу все указанные процессы должны быть запущены, а чтоб работало только при одном из указанных нельзя сделать? И чтоб если запущены все, то команда выполнялась только после закрытия всех процессов.
на cmd это будет некрасиво, много и жестоко для процессора
или детально распишите какая конкретная конечная цель задачи или поменяйте условия решения проблемы
только после закрытия всех процессов »
иначе это будет звучать как, если из заданных процессов работает хотя бы один - нет запуска, закрыты все - запуск:
@echo off
set "pr1=proc1.exe"
set "pr2=proc2.exe"
set "serv=service"
cmd /c for /l %%i in () do @tasklist^|findstr /c:"%pr1%" /c:"%pr2%"^|^| (net start "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
pause
Kukuruzo666
20-03-2018, 17:28
Теперь все как надо, спасибо!
Kukuruzo666
21-11-2018, 18:49
Помогите отредактировать код, плиз =) Если запустить процесс 1-4, при висячем процессе 123, то 123 убивается и останавливается служба "service". Мне нужно вырезать из кода остановку службы и добавить еще 2 процесса аналогичных 123, чтоб они закрывались вместе с ним.
:loop
set "proc=123.exe"
set "serv=service"
set "pr1=1.exe"
set "pr2=2.exe"
set "pr3=3.exe"
set "pr4=4.exe"
set "pr5=5.exe"
cmd /c for /l %%i in () do @for %%p in (1.exe 2.exe 3.exe 4.exe 5.exe) do @tasklist /fi "imagename eq %%p"^|findstr /v :^&^& (taskkill /f /im "%proc%"^& net stop "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
cmd /c for /l %%i in () do @tasklist^|findstr /c:"%pr1%" /c:"%pr2%" /c:"%pr3%" /c:"%pr4%" /c:"%pr5%"^|^| (net start "%serv%"^& exit /b)^&^>nul timeout /t 1 /nobreak
goto loop
если надо чтобы восстанавливались те которые надо запустить и не запущены (1-4), то стр10 надо поместить в подпрограмму
при запуске запускаем все 4-ре если не запущены и лопатим пока не убьем все запущенные заранее и обозначенные в подпрограмме
@echo off
set "proc1=123.exe"
set "proc2=132.exe"
set "proc3=213.exe"
set "pr1=1.exe"
set "pr2=2.exe"
set "pr3=3.exe"
set "pr4=4.exe"
for %%a in (%pr1% %pr2% %pr3% %pr4%) do tasklist|findstr /c:"%%a" || start "" "%%a"
for /l %%i in () do call :#
pause& exit
:#
:: for %%a in (%pr1% %pr2% %pr3% %pr4%) do tasklist|findstr /c:"%%a" || start "" "%%a"
for %%a in (%proc1% %proc2% %proc3%) do taskkill /f /im "%%a"
>nul timeout /t 1 /nobreak
exit /b
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.