NUT, выключить ПК через N минут

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-05 9:42:57

День добрый.

Имеется UPS Riello (сетевой SNMP), Freebsd9/
Настроил NUT на мониторинг (standalone, slave).

Задался вопросом, как выключить ПК не тогда когда UPS скажет что низкий заряд батареи, а скажем через 5 мин.
FINALDELAY, это немонго не то, это задержка после "сигнала о низком заряде"

Не уже ли штатно NUT такого не может и нужно скрипты/прилепы писать ?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-07 19:51:40

Вообщем для решения такой задачи нужно использовать конфиг nut шедулера upssched.conf и з поставки порта.

Вопрос закрыт ...

Аватара пользователя
andrian_freebsd
сержант
Сообщения: 171
Зарегистрирован: 2013-08-21 16:10:16
Откуда: Україна

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение andrian_freebsd » 2014-12-09 15:25:46

не подскажете в чем может быть проблема?

Код: Выделить всё

root@lvho01srfs03:/usr/home/andrian # /usr/local/etc/rc.d/nut start
Network UPS Tools - UPS driver controller 2.7.2
Network UPS Tools - BCMXCP UPS driver 0.28 (2.7.2)
USB communication subdriver 0.22
Communications with UPS lost: Error executing command
Could not communicate with the ups: Device busy
CLOSING

Driver failed to start (exit status=1)
/usr/local/etc/rc.d/nut: WARNING: failed precmd routine for nut
root@lvho01srfs03:/usr/home/andrian #
а если протестировать драйвер

Код: Выделить всё

root@lvho01srfs03:/usr/home/andrian # /usr/local/libexec/nut/bcmxcp_usb -DD -u root -a pw9125
Network UPS Tools - BCMXCP UPS driver 0.28 (2.7.2)
USB communication subdriver 0.22
   0.000000     debug level is '2'
   0.002060     entering nutusb_open()
   0.003823     device /dev/ugen3.2 opened successfully
   0.008783     entering get_answer(31)
   0.055815     get_answer: (16 bytes) => 5c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   0.055840     get_answer: wrong header
   0.058786     entering get_answer(31)
   0.087801     get_answer: (8 bytes) => 00 51 00 00 51 00 00 51
   0.087822     get_answer: wrong header
   0.090784     entering get_answer(31)
   0.119822     get_answer: (8 bytes) => 00 00 51 51 00 00 51 00
   0.119850     get_answer: wrong header
   0.122797     entering get_answer(31)
   0.151816     get_answer: (8 bytes) => 00 00 00 00 00 00 00 00
   0.151843     get_answer: wrong header
   0.154796     entering get_answer(31)
   0.185261     get_answer: (8 bytes) => 00 00 00 51 ec ab 01 2e
   0.185321     get_answer: wrong header
   0.185339     Communications with UPS lost: Error executing command
   0.185581     Could not communicate with the ups: Device busy
   0.185634     CLOSING

root@lvho01srfs03:/usr/home/andrian #
куда копать?

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-10 19:45:14

andrian_freebsd
К большому сожалению не знаю чем Вам можно подсказать ...

Едем дальше ...
Наткнулся на такую проблему.

Выключаю систему по таймауту (а не по низкому заряду батарей), соответственно настроен upssched.conf
Для этого имеем следующие настройки

upsmon.conf

Код: Выделить всё

...
SHUTDOWNCMD "/sbin/shutdown -h +0"
POWERDOWNFLAG /usr/local/etc/nut/killpower
NOTIFYCMD /usr/local/sbin/upssched
FINALDELAY 120
...
upssched.conf

Код: Выделить всё

CMDSCRIPT /usr/local/etc/nut/upssched-cmd
...
AT ONBATT * START-TIMER  upsgone 120
AT ONLINE * CANCEL-TIMER upsgone
upssched-cmd

Код: Выделить всё

#!/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"
           ;;
# Если поступила команда который нет в скрипте, запишем в лог об этом
    *)
           /usr/bin/logger -t upssched-cmd "Unrecognized command: $1"
          ;;
esac
rc.shutdown

Код: Выделить всё

.....
if [ -f /usr/local/etc/nut/killpower ]; then
           /bin/rm -f /usr/local/etc/nut/killpower
           /usr/local/sbin/upsdrvctl shutdown
# Выключаем питание после того как все диски будут синхронизированы.
# Для этого ждем N секунд
            sleep 90
fi
....
Особенность моего UPS в том что если он критически разряжен, то после включения начинает "срать" хреновыми статусами LB, FSD, замените батарею и т.д. в связи с этим было принято решение не выключать когда статус LB, а через 5 мин. До полного разряда UPS держит систему около 20 мин !!!

Что получается в итоге по выше показанным кускам конфигов.
После выключения света и статуса OB, по шедулеру upsshed.conf -> upssched-cmd NUT ждет 2 минуты, и запускает режим fsd.
NUT сключает режим fds тольео через 2 мин, прописанных в upsmon.conf FINALDELAY 120, мне так нужно т.к. на UPS еще висит один ПК и нужно что бы он корректно выключился.
После FINALDELAY 120, формируется файлик /usr/local/etc/nut/killpower и система начинает выключаться.
Последним при выключении срабатывает скрипт rc.shutdown.
Он видит файл флаг /usr/local/etc/nut/killpower и входит в if запуская последовательно 3 команды
/bin/rm -f /usr/local/etc/nut/killpower
/usr/local/sbin/upsdrvctl shutdown
sleep 90

По факту у меня выполняются всего 2
/bin/rm -f /usr/local/etc/nut/killpower
sleep 90
и не выполняется самая важная команда
/usr/local/sbin/upsdrvctl shutdown
которая должна выключить UPS вне зависимости появилось на нем питание или нет.

Далее согласно SHUTDOWNCMD "/sbin/shutdown -h +0" система говорит "Нажмите любую клавишу для перезагрузки".
В этот момент света еще нет, UPS разряжается до критического заряда и выключается от того что в аккумах нет емкости.
Соответственно выключается и сервак.

Далее при включении света все стартует, на UPS идет критическая нагрузка, он переходит в статус FSD, система еще не загрузившись начинает завершать работу, и опять выключается не дождавшись пока при выключении засинхронизируются диски.
А потом писец, снова новый старт, но система уже делает fsck (около часа), потом все загружается и начинает синхронизироваться зеркало gmirror (около 1.5 часа).

Вопрос:
Какого хера при корректной и грамотной настройкой NUT скрипт rc.shutdown не хочет отрабатывать команду /usr/local/sbin/upsdrvctl shutdown ?
Если эту команду запускаю в загруженной системе руками - все работает, UPS начинает странно "попикивать" и полностью выключается, а при подаче питания включается.

Собственно в догонку своей проблемы нашел вот такое решение, пока еще не пробовал... Жду пока диски засинхронятся и UPS зарядится.
http://klax.tula.ru/~drweb/shutdown.freebsd.txt

Может кто натыкался на подобное и есть какое то решение?

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-10 19:50:56

Вопрос №2.

Если все же решение одно, это запустить shutdown UPS из /usr/local/etc/rc.d/nut, то как мне выполнить выключение NUT последним в системе.
Т.е. потушить все остальные сервисы, типа mysql, nginx, apache и т.д. а сымым последним выключить nut, чтобы системе хватило времени дотушить все остельное, синхронизировать диски и корректно выключится.
После UPS shutdown у меня есть только 2 мин.

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение FiL » 2014-12-11 6:49:36

хоть и совсем не по теме, но почему не shutdown -p ?

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-11 7:38:36

FiL писал(а):хоть и совсем не по теме, но почему не shutdown -p ?
В моем плане выключения, при том что UPS должен выключится, можно и shutdown -p.

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-11 14:38:28

Вообщем решил попробовать так.

По спецификации UPS после upsdrvctl shutdown у меня есть 90 сек до выключения ИБП.
Судя из док, порядок выключения сервисов такойже как и запуска (в обратном порядке)
Посмотрел в каком порядке у меня nut

Код: Выделить всё

rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
и поднял его повыше в /usr/local/etc/rc.d/nut изменил

Код: Выделить всё

# PROVIDE: nut
# REQUIRE: NETWORKING
# BEFORE: LOGIN
# KEYWORD: shutdown
на

Код: Выделить всё

# PROVIDE: nut
# REQUIRE: FILESYSTEMS ldconfig
# BEFORE: SERVERS
# KEYWORD: shutdown
Так же закоментил то что добавлял в rc.shutdown и добавил этот код в /usr/local/etc/rc.d/nut

Код: Выделить всё

nut_poststop() {
           ${nut_prefix}/sbin/upsdrvctl stop
           if [ -f /usr/local/etc/nut/killpower ]; then
                      /bin/rm -f /usr/local/etc/nut/killpower
                      /usr/local/sbin/upsdrvctl shutdown
           fi
}
Перегрузил систему - nut работает.

Теперь надеюсь что Nut будет выключаться практически последним, запустит команду /usr/local/sbin/upsdrvctl shutdown и система успеет корректно выключится за 90 сек ...
Жду выключения света ...

Аватара пользователя
Neus
капитан
Сообщения: 1946
Зарегистрирован: 2008-09-08 21:59:56

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение Neus » 2014-12-11 19:21:10

Зачем же ждать? Выключи сам!

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-14 17:15:44

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
Х.з, не отработает один флаг, значит отработает второй.

Собственно жду до утра, утром запущу выключение после ночных бекапов и т.д.

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-16 10:00:29

Вообщем ни как не получается.

Скрипт rc.shutdown не отрабатывает до конца, при чем это происходит только если система некоторое время поработает "нагрузится".
На свежезагруженной системе +/- 20 мин (как минимум) все отрабатывает как нужно.

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

Как видно из фотографий система выдает

Код: Выделить всё

init: timeoute expired for /bun/sh on /etc/rc.shutdown: Interrupted systemcall: going to single user mode
Подобное сообщение при каждом завершении работы при нагруженной системе.
Понимаю что вопрос переходит за рамки озвученной темы...

Собственно что можно посмотреть в системе?
Как полечить проблему?

Заранее спасибо ...
Вложения
IMAG0143_1.jpg
IMAG0145_1.jpg

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-21 11:13:01

Господа, вопрос становится мега актуальным ...

Помогите каким нить советом, как выявить причину почему rc.shudown не отрабатывает до конца а прерывается ...

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-21 11:22:34

Бля ...

Код: Выделить всё

>> sysctl -a | grep kern.init_shutdown_timeout
kern.init_shutdown_timeout: 120
Поменял на 420 сек - 7 мин, погляжу что так получится.
Не понятно тогда что задает параметр в rc.conf rcshutdown_timeout="..."

Аватара пользователя
kharkov_max
капитан
Сообщения: 1859
Зарегистрирован: 2008-10-03 14:56:40

Re: NUT, выключить ПК через N минут

Непрочитанное сообщение kharkov_max » 2014-12-22 17:45:01

Да, похоже что параметр sysctl kern.init_shutdown_timeout, то что нужно.
Система стала ожидать дальше и не вырубилась через 2 мин.

Но постигла другая неудача.
После длительной работы плохо идет корректное завершение софта.

Для примера система остановилась на остановке mysql сервера, и ждала завершения его работы минут 5, пришлось сбросить и завершить работу системы побыстрее.

Собственно с какой стороны подойти к вопросу ?
Чтио можно помониторить, посмотреть ?

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