Как я могу систематически завершать работу служб Windows по порядку?

У нас есть это приложение с открытым исходным кодом, которое имеет три (3) сервиса. Для целей этого вопроса давайте назовем их A, B и C.

Теперь они должны быть закрыты в определенном порядке. Этот порядок будет A, затем B, а затем C.

Если B выключится раньше, чем A, мы столкнемся с различными проблемами. То же самое верно, если C выключается раньше, чем B или A. Плюс, каждому сервису может потребоваться различное количество времени для закрытия из-за того, сколько пользователей его использовали.

О, это нужно обернуть в пакетный файл DOS или что-то, что может сделать пользователь, не имеющий отношения к делу, просто дважды щелкнув по нему мышью. (PowerShell не исключен, но я никогда не использовал его). Кроме того, я кодер C#, так что это тоже можно использовать.

В любом случае, когда перезапуск инициирован, должно произойти следующее:

1) Initiate shutdown of service A
2) When service A is down, it should trigger the shutdown of service B
3) When service B is down, it should trigger the shutdown of service C
4) When service C is down, it should trigger the START UP of service A
5) When service A is UP, it should trigger the START UP of service B
6) When service B is UP, it should trigger the START UP of service C

Итак, как вы можете видеть, каждый стоп / старт должен ждать предыдущего, чтобы полностью завершиться, прежде чем двигаться дальше. И поскольку каждая служба может занять от нескольких секунд до нескольких минут, мы не можем использовать какие-либо временные уловки.

Предложения с благодарностью.

Спасибо!

1 ответ

Решение

Вы можете сделать это с помощью PowerShell. Чтобы остановить службу, вы используете команду Stop-Service. Запуск службы осуществляется командой Start-Service. Таким образом, вы можете создать сценарий, в котором будет несколько записей, таких как следующие, для каждой службы, которую нужно остановить, по порядку:

Stop-Service ServiceA
do { Start-Sleep -Milliseconds 200}
until ((get-service ServiceA).status -eq 'Stopped')

и запустить сервисы:

Start-Service ServiceA
do { Start-Sleep -Milliseconds 200}
until ((get-service ServiceA).status -eq 'Running')

Затем вы можете объединить 6 из этих блоков кода в сценарии, сохранить его как файл.ps1 и запустить его из командной строки powershell следующим образом:

PS C:\> C:\Path\To\Script\script.ps1
Другие вопросы по тегам