Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   остановка службы по PID (http://forum.oszone.net/showthread.php?t=237451)

quazar-ed 28-06-2012 11:26 1941924

остановка службы по PID
 
Добрый день!

помогите пожалуйста написать батник, который по пиду будет убивать повисшую службу

в ручную делаю так. запрашиваю пид службы командой sc queryex и далее по полученному пид убиваю принудительно службу taskkill /f /pid

как это сделать в автомате?

Iska 28-06-2012 12:46 1941985

quazar-ed, остановка службы — это одно. Снятие процесса службы — совсем другое. Определитесь.

Как Вы определяете, что служба:
Цитата:

Цитата quazar-ed
повисшую службу »

?

quazar-ed 28-06-2012 15:04 1942096

Цитата:

Цитата Iska
Как Вы определяете, что служба: »

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

после этого приходится делать то что писал в первом сообщении... т.е. убивать процесс службы

Iska 28-06-2012 16:28 1942151

1. Это какая-то определённая служба? У неё есть имя?
2. Зачем её надо Вам останавливать?

Anonymоus 28-06-2012 20:38 1942285

Код:

@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


quazar-ed 29-06-2012 09:00 1942517

Iska,
1. да служба определенная. и имя естественно есть
2. останавливать нужно для: 1) эта служба базы оракл (который когда-то и кем-то был установлен некорректно с чем и собственно связанны эти зависания службы), 2) эта служба отвечает за работу удаленного клиента, который в свою очередь при повисании этой службы не может получить доступ к базе
п.с.
надеюсь понятно изложил

Anonymоus,
благодарю за код, но теперь возникает вопрос. когда служба висит то статус у нее все равно запущена, код определив статус выдает, что она запущена и прекращает работу, можно ли его подправить чтобы код пробовал службу перезапустить, а если это не выходит то убивал её как дальше и описано в нём?

Anonymоus 29-06-2012 10:29 1942555

Цитата:

Цитата quazar-ed
код определив статус выдает, что она запущена и прекращает работу »

Неверно, потому что если служба запущена (Status: Running) - как раз и происходят все последующие операции - попытка корректной остановки или убийства процесса, если предыдущее не вышло, а после - запуск снова, т.е. то, что вы и описали, перезапуск.

quazar-ed 29-06-2012 11:01 1942582

Anonymоus,
запускаю Ваш код подставив имя своей службы в место
Цитата:

Цитата Anonymоus
JavaQuickStarterService »

на что мне выдается сообщение

Код:

Затребованная служба уже запущена.

Для вызова дополнительной справки наберите NET HELPMSG 2182.

Для продолжения нажмите любую клавишу . . .

так и должно быть?

Anonymоus 29-06-2012 11:23 1942597

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


quazar-ed 29-06-2012 11:40 1942606

Anonymоus, я благодарен за Вашу помощь, но что-то похоже опять не так )).. выдает тоже самое сообщение снова. может задержка мала?

Anonymоus 03-07-2012 09:25 1944734

Цитата:

Цитата 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

Не смог отправить личное сообщение, пишет, что личка переполнена.

quazar-ed 03-07-2012 10:20 1944766

Спасибо за код! Как только опробую на зависшей службе сразу же отпишусь


Время: 22:47.

Время: 22:47.
© OSzone.net 2001-