Войти

Показать полную графическую версию : Остановка службы при запуске определенного процесса и запуск после его завершения.


Kukuruzo666
10-02-2018, 03:34
К примеру служба носит название "1", а процесс "2". Служба работает, а процесс не запущен. Как только процесс запустился, служба сразу останавливается, а как только он завершился, служба сразу запускается.

alpap
10-02-2018, 14:05
@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
А можно узнать как сделать так, чтоб мониторились не один, а несколько процессов и при появлении одного из этих процессов сначала завершался определенный процесс, а уже потом останавливалась служба?

alpap
18-03-2018, 02:02
по идее как-то так:

@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

alpap
19-03-2018, 13:55
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
Понял почему не работало. Сразу все указанные процессы должны быть запущены, а чтоб работало только при одном из указанных нельзя сделать? И чтоб если запущены все, то команда выполнялась только после закрытия всех процессов.

alpap
20-03-2018, 13:53
на cmd это будет некрасиво, много и жестоко для процессора
или детально распишите какая конкретная конечная цель задачи или поменяйте условия решения проблемы

alpap
20-03-2018, 16:59
только после закрытия всех процессов »
иначе это будет звучать как, если из заданных процессов работает хотя бы один - нет запуска, закрыты все - запуск:


@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

alpap
22-11-2018, 19:21
если надо чтобы восстанавливались те которые надо запустить и не запущены (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