У меня есть служба Windows, которую мне нужно останавливать и запускать каждые 30 минут с помощью запланированной задачи Windows.
Сама служба может быть остановлена вручную через консоль управления службами (щелкните правой кнопкой мыши -> Stop, щелкните правой кнопкой мыши -> Start).
Следующий пакетный файл, запускаемый двойным щелчком по файлу или через командную строку, работает практически мгновенно, успешно останавливает и запускает службу:
net stop "Service Name"
net start "Service Name"
Однако, когда я создаю запланированное задание для запуска этого пакетного файла каждые 30 минут, у меня возникают проблемы.
Когда я запускаю запланированное задание (щелкните правой кнопкой мыши -> Выполнить), служба, похоже, застревает в состоянии "Остановка" примерно на 2 минуты, а затем остается остановленной. Запланированное задание, похоже, не сообщает об ошибках и просто сидит в ожидании следующих 30 минут.
Это на Windows Server 2008 R2 и следующих параметрах запланированных задач:
- Старт ежедневно в 08:00:00
- Повторяйте каждые 30 минут до бесконечности
- Если задача уже включена, не запускайте другую
- Разрешить выполнение задачи по требованию
- Если задача не выполняется, перезапускайте каждые 30 минут
- Запуск от имени NT AUTHORITY\SYSTEM
- Запускать, даже если пользователь не авторизован
- Беги с самыми высокими привилегиями
- Настроить для Windows 7, Windows Server 2008 R2
Я в растерянности, это известная проблема? Я делаю что-то неправильно? Единственный другой вопрос, который кажется похожим, вот этот: есть ли проблема с 64-разрядной службой остановки Windows 7?, но я не знаю, связана ли моя проблема, и я могу воспроизвести ее каждый раз (кажется, что она никогда не работает как запланированная задача, но работает нормально, если я просто запускаю пакетный файл сам)
Если вы можете придумать лучшее название вопроса, пожалуйста, не стесняйтесь менять!
На самом деле не имеет отношения к вопросу, но в случае, если вам интересно, я делаю это как временное решение проблемы, связанной с сетью, когда служба (которая взаимодействует через сокет-соединение с другой службой на удаленный компьютер) порт часто закрывается из-за неактивности. Поскольку сетевая инфраструктура не может быть изменена, сама служба в конечном итоге будет обновлена, чтобы обеспечить более регулярный контакт с удаленной службой.
ОБНОВЛЕНИЕ ПОСЛЕ ПРЕДЛОЖЕНИЙ
Итак, по какой-то причине служба слишком долго останавливалась, когда мой маленький пакетный файл запускался как запланированное задание, поэтому я написал следующий пакетный файл, который ожидает его остановки (спасибо @CoreTech за SC. Отлично, подсказка)
net stop "service name"
REM Wait for the service to stop (could take a minute or two...)
:loop_start
sc query "service name" | FIND "STATE" | FIND "STOPPED"
if errorlevel 1 goto :timeout_wait
REM Start the service again...
net start "service name"
goto :end
:timeout_wait
timeout 30
goto :loop_start
:end
Это работает нормально, но я до сих пор не знаю, почему поведение отличается от простой остановки службы вручную и настройки запланированной задачи :(
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ
После нескольких часов представления моей головы о соседней кирпичной стене * меня внезапно осенило, что в этом кольце печально известной смерти Windows Service ...
Участвуют две службы (я не упоминал об этом раньше, потому что не думал, что это актуально). Оказывается, что из-за неправильной конфигурации или, возможно, саботажа, обе службы пытаются подключиться через сеть к одному и тому же номеру порта ... Конфликт вызывал проблемы, которые в первую очередь приводили к необходимости перезапуска служб, и способствовал странному поведению при перезапуске служб. Как только я отключил один сервис и работал только с одним сервисом, все стало работать точно так, как ожидалось ... Мораль истории: не просто ищите решение, поймите проблему, и решение представится вам!
Я только что сделал это морально, это работа в процессе ...
* Я: «Голова, кирпичная стена; кирпичная стена, голова».
Голова: идет на рукопожатие, понимает, что у него нет рук ... чел ...
Мяу..."
Кирпичная стена: ничего не делает ... это кирпичная стена