остановка службы по PID
Добрый день!
помогите пожалуйста написать батник, который по пиду будет убивать повисшую службу
в ручную делаю так. запрашиваю пид службы командой sc queryex и далее по полученному пид убиваю принудительно службу taskkill /f /pid
как это сделать в автомате?
|
quazar-ed, остановка службы — это одно. Снятие процесса службы — совсем другое. Определитесь.
Как Вы определяете, что служба:
?
|
Цитата:
Цитата Iska
Как Вы определяете, что служба: »
|
захожу в консоль "Службы" пытаюсь остановить её вручную долго идет процесс остановки, не останавливается выдает ошибку о том что служба не ответила вовремя и всё, так и остается в состоянии не включена и не выключена..
после этого приходится делать то что писал в первом сообщении... т.е. убивать процесс службы
|
1. Это какая-то определённая служба? У неё есть имя?
2. Зачем её надо Вам останавливать?
|
Код:
@Echo Off
Set ServiceName=JavaQuickStarterService
:: Получаем состояние службы, проверяем запущена ли она
SC queryex %ServiceName%|Find "STATE"|Find "RUNNING">Nul&&(
rem Пробуем остановить
Net stop %ServiceName%||(
rem Если остановить через net stop не вышло, запрашиваем PID
For /F "tokens=3" %%A In ('SC queryex %ServiceName%^|Find "PID"') Do (
rem Убиваем процесс вместе с дочерними, используя полученный PID
TaskKill /F /T /PID %%A
)
)
)
rem Если служба не была запущена, или уже убита к тому времени - запускаем её
Net start %ServiceName%
Pause
|
Iska,
1. да служба определенная. и имя естественно есть
2. останавливать нужно для: 1) эта служба базы оракл (который когда-то и кем-то был установлен некорректно с чем и собственно связанны эти зависания службы), 2) эта служба отвечает за работу удаленного клиента, который в свою очередь при повисании этой службы не может получить доступ к базе
п.с.
надеюсь понятно изложил
Anonymоus,
благодарю за код, но теперь возникает вопрос. когда служба висит то статус у нее все равно запущена, код определив статус выдает, что она запущена и прекращает работу, можно ли его подправить чтобы код пробовал службу перезапустить, а если это не выходит то убивал её как дальше и описано в нём?
|
Цитата:
Цитата quazar-ed
код определив статус выдает, что она запущена и прекращает работу »
|
Неверно, потому что если служба запущена (Status: Running) - как раз и происходят все последующие операции - попытка корректной остановки или убийства процесса, если предыдущее не вышло, а после - запуск снова, т.е. то, что вы и описали, перезапуск.
|
Anonymоus,
запускаю Ваш код подставив имя своей службы в место
Цитата:
Цитата Anonymоus
JavaQuickStarterService »
|
на что мне выдается сообщение
Код:
Затребованная служба уже запущена.
Для вызова дополнительной справки наберите NET HELPMSG 2182.
Для продолжения нажмите любую клавишу . . .
так и должно быть?
|
quazar-ed, попробуйте вот так, я не учел того, что без задержки после убийства процесса информация о службах не успевает обновиться, добавил эту самую задержку.
Код:
@Echo Off
Set ServiceName=JavaQuickStarterService
:: Получаем состояние службы, проверяем запущена ли она
SC queryex %ServiceName%|Find "STATE"|Find "RUNNING">Nul&&(
rem Пробуем остановить
Net stop %ServiceName%>nul||(
rem Если остановить через net stop не вышло, запрашиваем PID
For /F "tokens=3" %%A In ('SC queryex %ServiceName%^|Find "PID"') Do (
rem Убиваем процесс вместе с дочерними, используя полученный PID
TaskKill /F /T /PID %%A>nul
rem Задержка, чтобы обновился статус службы после убийства процесса
Ping -n 4 127.0.0.1>nul
)
rem На всякий случай
Net stop %ServiceName% 2>nul
)
)
rem Если служба не была запущена, или уже убита к тому времени - запускаем её
Net start %ServiceName%
Pause
|
Anonymоus, я благодарен за Вашу помощь, но что-то похоже опять не так )).. выдает тоже самое сообщение снова. может задержка мала?
|
Цитата:
Цитата quazar-ed
Добрый день!
Сегодня пробовал все варианты кода, но к сожалению безуспешно (, всё так же выскакивает сообщение о том что служба уже запущена. Если у Вас найдется свободное время подправить код так, что бы он просто находил ПИД процесса службы и убивал его без запроса статуса состояния.
|
Подправил. У меня просто нету возможности проверить, как будет реагировать на мой скрипт зависшая служба, не на чем проверить - поэтому Вы правы, проще всего будет проверку убрать.
Код:
@Echo Off
SetLocal EnableDelayedExpansion
Set ServiceName=JavaQuickStarterService
Net Stop %ServiceName%||(
For /F "tokens=3" %%A In ('SC queryex %ServiceName%^|Find "PID"') Do (
TaskKill /F /PID %%A>nul
Ping -n 5 127.0.0.1>nul
)
)
Net start %ServiceName%
Pause&Exit
Не смог отправить личное сообщение, пишет, что личка переполнена.
|
Спасибо за код! Как только опробую на зависшей службе сразу же отпишусь
|
Время: 22:47.
© OSzone.net 2001-