остановить / запустить службу Windows с помощью findstr

Мне нужно остановить и запустить службу, когда в файле .txt соблюдены определенные параметры.

Когда мое приложение не может подключиться к базе данных в нашей тестовой среде (обычное явление), оно создает файл следующего типа в папке сервера (дата файла меняется при каждом появлении)

SelfTest-20141126181000-RED.txt

В этом файле есть фраза

КРАСНЫЙ: Не удалось запустить сервер: невозможно открыть базу данных: невозможно подключиться к базе данных

Каждый раз, когда это генерируется, вместе с этой фразой мне нужно остановить и запустить определенную службу.

Я никогда не использовал команду findstr, но думаю, что здесь она может быть полезна. Очевидно, что текстовый файл нуждается в подстановочных знаках, и я хотел бы, чтобы файл результатов, созданный с помощью службы данных и времени, был остановлен и запущен. Будет ли работать следующее?

findstr "RED: Server failed to start: Unable to open database: Unable to connect to database” *RED.txt
if %errorlevel%==0 (
sc stop "my service"
sc start "my service"
echo %DATE% %TIME% database >> results.txt
)

План состоит в том, чтобы это выполнялось через запланированные задачи каждые 30 минут или около того.


person Marc Lawrie    schedule 27.11.2014    source источник
comment
Не было бы намного проще сделать это из вашего приложения?   -  person MSalters    schedule 27.11.2014
comment
Извините, возможно, приложение было неправильным словом. Это программа, установленная на самом сервере Windows, которая работает как служба. именно эта программа общается с базой данных Oracle, когда эта база данных недоступна, появляется документ RED .txt.   -  person Marc Lawrie    schedule 27.11.2014
comment
Значит, служба, которая записывает файл, также является службой, которую необходимо перезапустить? Предположительно у вас нет исходного кода для этого сервиса? Потому что, если вы это сделаете, почему бы не перезапустить службу? sc stop просто отправляет сообщение через диспетчер управления службами.   -  person MSalters    schedule 27.11.2014
comment
Абсолютно прав по обоим пунктам. Это тот же сервис, который нужно перезапустить, и у нас нет исходного кода. Поэтому я искал лучший способ остановить службу (которая генерирует флаг для нашей рабочей очереди при остановке, поэтому я знаю об этом), когда база данных недоступна. В противном случае он продолжает до тошноты пытаться подключиться.   -  person Marc Lawrie    schedule 27.11.2014


Ответы (1)


Что ж, очевидно, что если у вас есть один такой файл, ваш скрипт будет продолжать его находить и перезапускать службу каждые 30 минут. Вам нужно будет удалить или переместить файл RED.

Вторая проблема заключается в том, что команда sc start может завершиться ошибкой, пока служба все еще остановлена ​​— sc stop возвращается, как только запрос доставлен, и не ждет. Вам потребуется повторная sc query "ServiceName" | find "RUNNING" проверка. И пока служба все еще работает, дайте ей еще немного времени, запустив ping -n 2 127.0.0.1 > nul. Занятое ожидание нехорошо, но нет чистой команды sleep, поэтому ping — это обычный хак для этого.

person MSalters    schedule 27.11.2014
comment
Спасибо за это. Честно говоря, я был бы рад, если бы сервис просто остановился, а затем не попытался запуститься. По крайней мере, таким образом я буду помечен как проблема и приму меры. Затем я могу запустить его вручную, когда буду готов. Итак, если убрать опцию запуска sc, остальная часть кода выглядит нормально? Я не был уверен в формате подстановочных знаков в файле RED. - person Marc Lawrie; 27.11.2014
comment
В тексте справки findstr указано, что точка является подстановочным знаком, а звездочка образует функцию повтора, поэтому не будет 100%, если это будет .RED.txt или *RED.txt. - person Marc Lawrie; 27.11.2014
comment
Нет, это синтаксис регулярного выражения строки поиска. - person MSalters; 28.11.2014