На днях решал задачу корректного выключения всех серверов в компании при отключении питания. Простейшая задача оказалась не так проста для решения :-). Мы используем ИБП APC SURT3000XLI — аппарат хороших, к нему подключено несколько серверов, но проблема в том что USB-кабель один, и соответственно можно поставить Agent только на один сервер, он то и будет выключен автоматически, остальным просто отрубят питание.

APC PowerShute Business Edition позволяет перед выключением сервера выполнить командный файл. Самое простое решение напрашивалось само собой

shutdown  -s -m -f \\server1
shutdown  -s -m -f \\server2
shutdown  -s -m -f \\server3

Не тут то было. Оказывается PowerShute очень интересно обрабатывает командные файлы, и сам по себе файл надо приводить к виду «понятному» агенту @START «» «shutdown -s -m -f \\server1» к сожалению это тоже не помогло. Почитав дальше форумы и сайт apc.com выяснил что службу APCBEAgent надо запускать от имени пользователя, который имеет права выключать сервера, логично, но изменение и имени входа не дола желаемого результата. У меня сложилось впечатление, что APC специально блокирует запуск программы shutdown и с ней похожих, провоцируя нас переходить на другие продукты.

Но как говорится русские на сдаются. Прибегнув к помощи коллег, была быстро написана программа на C#, которая просто выполняет список команд в файле :-) . В итоге имеем AppLauncher.exe файл command.txt и уже в нем знакомые всем строки:

shutdown  -s -m -f \\server1
shutdown  -s -m -f \\server2
shutdown  -s -m -f \\server3

Указываем в качестве исполняемого файла AppLauncher.exe и все, сервера выключаются великолепно.

Скачать утилиту можете здесь AppLauncher.zip.