Neus писал(а):Зачем же ждать? Выключи сам!
Да не рядом я был, и уже UPS был изнасилован, батареи могли не выдержать..
Собственно потратил несколько дней на эксперименты.
Вот каков результат.
Все же заработало из rc.shutdown
Где то нарыл что верно писать отключение УПС вот так
Код: Выделить всё
/usr/local/sbin/upsdrvctl shutdown powercom
Т.е. указывать драйвер UPS, у меня Powercom.
Так же еще нарыл вот такую конструкцию
Код: Выделить всё
if [ -f /usr/local/etc/nut/killpower ]; then
/bin/rm -f /usr/local/etc/nut/killpower
/usr/local/sbin/upsdrvctl shutdown powercom
if[ $? -ne 0 ]; then
/usr/local/libexec/nut/powercom -k -D -a myups
fi
sleep 5
fi
Как я ее понял если не отработал upsdrvctl выключаем через драйвер, где myups имя упса из конфига.
Х.з. к чему оно, но вроде как все равно не отрабатывает.
Вообщем в итоге заработало вот так:
Код: Выделить всё
if [ -f /usr/local/etc/nut/killpower ]; then
/bin/rm -f /usr/local/etc/nut/killpower
/usr/local/sbin/upsdrvctl shutdown powercom
sleep 5
fi
Делаю тест, перегружаю OS - выдергиваю 220, наблюдаю верную последовательность завершения работы ПК, и отключения UPS.
Думаю все - ПОБЕДА !!!
Да не тут то было.
Через 8-9 часов после последнего запуска сервера, ради интереса опять отрубаю питание, и получаю болт.
Сервер работу завершил, но UPS продолжает пикать и не выключился.
Начал искать причину, оказалось что ...
Мой сервер достаточно нагружен, запущено много разных процессов, при выключении системы некоторые процессы достаточно долго закрываются, в итоге отрабатывает системная переменная rcshutdown_timeout
http://www.lissyara.su/articles/freebsd/tuning/rc.conf
На сколько я понял, если процесс выключения системы занимает более чем указано в этой переменной (по умолчанию Freebsd10 90сек), то система жестко рубит процесс rc.shutdown.
Только это объясняет что не отрабатывает кусок кода на выключение UPS написанный в конце этого скрипта.
Для своей системы увеличил в rc.conf rcshutdown_timeout="420", надеюсь мне этого хватит и UPS по идее выдержит это время + задержки из конфигов NUT.
Так же в процессе тестирования обнаружил еще один косяк.
В rc.shutdown комментирую свою строку
Код: Выделить всё
if [ -f /usr/local/etc/nut/killpower ]; then
#/bin/rm -f /usr/local/etc/nut/killpower
/usr/local/sbin/upsdrvctl shutdown powercom
if[ $? -ne 0 ]; then
/usr/local/libexec/nut/powercom -k -D -a myups
fi
sleep 5
fi
Суть проверки была такова, формирует ли Nut при выключении файл флаг, т.е. запускаем выключение, загружаемся и файл должен существовать.
В момент выключения делаю периодически ls ./killpow*, вижу что файл появляется, но после загрузки его нет !!!
При чем странность в том что происходило это как то не стабильно - через раз....
В результате не совсем доверяя работе NUT, добавил свой хак.
Т.к. я использую механизм upsshed (шедулера), в cdm файл шедулера добавил формирование 2го файла флага killpower2
Код: Выделить всё
#!/bin/sh
case $1 in
# Имя нашего таймера, указанного в upssched.conf
upsgone)
# Если когда произошло событие нужно записать в лог
/usr/bin/logger -t upssched-cmd "shutdown on 120 sek"
# Выполняем команду на выключение
/usr/local/sbin/upsmon -c fsd
/usr/bin/logger -t upssched-cmd "fsd enable"
echo "1" >> /usr/local/etc/nut/killpower2
;;
# Если поступила команда который нет в скрипте, запишем в лог об этом
*)
/usr/bin/logger -t upssched-cmd "Unrecognized command: $1"
;;
esac
И соответсвенную секцию в rc.shutdown
Код: Выделить всё
if [ -f /usr/local/etc/nut/killpower2 ]; then
/bin/rm -f /usr/local/etc/nut/killpower2
/usr/local/sbin/upsdrvctl shutdown powercom
fi
Х.з, не отработает один флаг, значит отработает второй.
Собственно жду до утра, утром запущу выключение после ночных бекапов и т.д.