NUT, выключить ПК через N минут
Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
- kharkov_max
- капитан
- Сообщения: 1859
- Зарегистрирован: 2008-10-03 14:56:40
NUT, выключить ПК через N минут
День добрый.
Имеется UPS Riello (сетевой SNMP), Freebsd9/
Настроил NUT на мониторинг (standalone, slave).
Задался вопросом, как выключить ПК не тогда когда UPS скажет что низкий заряд батареи, а скажем через 5 мин.
FINALDELAY, это немонго не то, это задержка после "сигнала о низком заряде"
Не уже ли штатно NUT такого не может и нужно скрипты/прилепы писать ?
Имеется UPS Riello (сетевой SNMP), Freebsd9/
Настроил NUT на мониторинг (standalone, slave).
Задался вопросом, как выключить ПК не тогда когда UPS скажет что низкий заряд батареи, а скажем через 5 мин.
FINALDELAY, это немонго не то, это задержка после "сигнала о низком заряде"
Не уже ли штатно NUT такого не может и нужно скрипты/прилепы писать ?
Услуги хостинговой компании Host-Food.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/
Тарифы на виртуальные сервера (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 минут
Вообщем для решения такой задачи нужно использовать конфиг nut шедулера upssched.conf и з поставки порта.
Вопрос закрыт ...
Вопрос закрыт ...
- andrian_freebsd
- сержант
- Сообщения: 171
- Зарегистрирован: 2013-08-21 16:10:16
- Откуда: Україна
Re: NUT, выключить ПК через N минут
не подскажете в чем может быть проблема?
а если протестировать драйвер
куда копать?
Код: Выделить всё
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 минут
andrian_freebsd
К большому сожалению не знаю чем Вам можно подсказать ...
Едем дальше ...
Наткнулся на такую проблему.
Выключаю систему по таймауту (а не по низкому заряду батарей), соответственно настроен upssched.conf
Для этого имеем следующие настройки
upsmon.conf
upssched.conf
upssched-cmd
rc.shutdown
Особенность моего 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
Может кто натыкался на подобное и есть какое то решение?
К большому сожалению не знаю чем Вам можно подсказать ...
Едем дальше ...
Наткнулся на такую проблему.
Выключаю систему по таймауту (а не по низкому заряду батарей), соответственно настроен upssched.conf
Для этого имеем следующие настройки
upsmon.conf
Код: Выделить всё
...
SHUTDOWNCMD "/sbin/shutdown -h +0"
POWERDOWNFLAG /usr/local/etc/nut/killpower
NOTIFYCMD /usr/local/sbin/upssched
FINALDELAY 120
...
Код: Выделить всё
CMDSCRIPT /usr/local/etc/nut/upssched-cmd
...
AT ONBATT * START-TIMER upsgone 120
AT ONLINE * CANCEL-TIMER upsgone
Код: Выделить всё
#!/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
Код: Выделить всё
.....
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
....
Что получается в итоге по выше показанным кускам конфигов.
После выключения света и статуса 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 минут
Вопрос №2.
Если все же решение одно, это запустить shutdown UPS из /usr/local/etc/rc.d/nut, то как мне выполнить выключение NUT последним в системе.
Т.е. потушить все остальные сервисы, типа mysql, nginx, apache и т.д. а сымым последним выключить nut, чтобы системе хватило времени дотушить все остельное, синхронизировать диски и корректно выключится.
После UPS shutdown у меня есть только 2 мин.
Если все же решение одно, это запустить shutdown UPS из /usr/local/etc/rc.d/nut, то как мне выполнить выключение NUT последним в системе.
Т.е. потушить все остальные сервисы, типа mysql, nginx, apache и т.д. а сымым последним выключить nut, чтобы системе хватило времени дотушить все остельное, синхронизировать диски и корректно выключится.
После UPS shutdown у меня есть только 2 мин.
-
- ст. лейтенант
- Сообщения: 1374
- Зарегистрирован: 2010-02-05 0:21:40
Re: NUT, выключить ПК через N минут
хоть и совсем не по теме, но почему не shutdown -p ?
- kharkov_max
- капитан
- Сообщения: 1859
- Зарегистрирован: 2008-10-03 14:56:40
Re: NUT, выключить ПК через N минут
В моем плане выключения, при том что UPS должен выключится, можно и shutdown -p.FiL писал(а):хоть и совсем не по теме, но почему не shutdown -p ?
- kharkov_max
- капитан
- Сообщения: 1859
- Зарегистрирован: 2008-10-03 14:56:40
Re: NUT, выключить ПК через N минут
Вообщем решил попробовать так.
По спецификации UPS после upsdrvctl shutdown у меня есть 90 сек до выключения ИБП.
Судя из док, порядок выключения сервисов такойже как и запуска (в обратном порядке)
Посмотрел в каком порядке у меня nut
и поднял его повыше в /usr/local/etc/rc.d/nut изменил
на
Так же закоментил то что добавлял в rc.shutdown и добавил этот код в /usr/local/etc/rc.d/nut
Перегрузил систему - nut работает.
Теперь надеюсь что Nut будет выключаться практически последним, запустит команду /usr/local/sbin/upsdrvctl shutdown и система успеет корректно выключится за 90 сек ...
Жду выключения света ...
По спецификации UPS после upsdrvctl shutdown у меня есть 90 сек до выключения ИБП.
Судя из док, порядок выключения сервисов такойже как и запуска (в обратном порядке)
Посмотрел в каком порядке у меня nut
Код: Выделить всё
rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
Код: Выделить всё
# PROVIDE: nut
# REQUIRE: NETWORKING
# BEFORE: LOGIN
# KEYWORD: shutdown
Код: Выделить всё
# PROVIDE: nut
# REQUIRE: FILESYSTEMS ldconfig
# BEFORE: SERVERS
# KEYWORD: shutdown
Код: Выделить всё
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 будет выключаться практически последним, запустит команду /usr/local/sbin/upsdrvctl shutdown и система успеет корректно выключится за 90 сек ...
Жду выключения света ...
- Neus
- капитан
- Сообщения: 1946
- Зарегистрирован: 2008-09-08 21:59:56
Re: NUT, выключить ПК через N минут
Зачем же ждать? Выключи сам!
- kharkov_max
- капитан
- Сообщения: 1859
- Зарегистрирован: 2008-10-03 14:56:40
Re: NUT, выключить ПК через N минут
Да не рядом я был, и уже UPS был изнасилован, батареи могли не выдержать..Neus писал(а):Зачем же ждать? Выключи сам!
Собственно потратил несколько дней на эксперименты.
Вот каков результат.
Все же заработало из rc.shutdown
Где то нарыл что верно писать отключение УПС вот так
Код: Выделить всё
/usr/local/sbin/upsdrvctl shutdown 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
Х.з. к чему оно, но вроде как все равно не отрабатывает.
Вообщем в итоге заработало вот так:
Код: Выделить всё
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
Думаю все - ПОБЕДА !!!
Да не тут то было.
Через 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
В момент выключения делаю периодически 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
Код: Выделить всё
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 минут
Вообщем ни как не получается.
Скрипт rc.shutdown не отрабатывает до конца, при чем это происходит только если система некоторое время поработает "нагрузится".
На свежезагруженной системе +/- 20 мин (как минимум) все отрабатывает как нужно.
Во вложении фотки завершения работы системы под нагрузкой, фотографии разных завершений работы.
Как видно из фотографий система выдает
Подобное сообщение при каждом завершении работы при нагруженной системе.
Понимаю что вопрос переходит за рамки озвученной темы...
Собственно что можно посмотреть в системе?
Как полечить проблему?
Заранее спасибо ...
Скрипт rc.shutdown не отрабатывает до конца, при чем это происходит только если система некоторое время поработает "нагрузится".
На свежезагруженной системе +/- 20 мин (как минимум) все отрабатывает как нужно.
Во вложении фотки завершения работы системы под нагрузкой, фотографии разных завершений работы.
Как видно из фотографий система выдает
Код: Выделить всё
init: timeoute expired for /bun/sh on /etc/rc.shutdown: Interrupted systemcall: going to single user mode
Понимаю что вопрос переходит за рамки озвученной темы...
Собственно что можно посмотреть в системе?
Как полечить проблему?
Заранее спасибо ...
- kharkov_max
- капитан
- Сообщения: 1859
- Зарегистрирован: 2008-10-03 14:56:40
Re: NUT, выключить ПК через N минут
Господа, вопрос становится мега актуальным ...
Помогите каким нить советом, как выявить причину почему rc.shudown не отрабатывает до конца а прерывается ...
Помогите каким нить советом, как выявить причину почему rc.shudown не отрабатывает до конца а прерывается ...
- kharkov_max
- капитан
- Сообщения: 1859
- Зарегистрирован: 2008-10-03 14:56:40
Re: NUT, выключить ПК через N минут
Бля ...
Поменял на 420 сек - 7 мин, погляжу что так получится.
Не понятно тогда что задает параметр в rc.conf rcshutdown_timeout="..."
Код: Выделить всё
>> sysctl -a | grep kern.init_shutdown_timeout
kern.init_shutdown_timeout: 120
Не понятно тогда что задает параметр в rc.conf rcshutdown_timeout="..."
- kharkov_max
- капитан
- Сообщения: 1859
- Зарегистрирован: 2008-10-03 14:56:40
Re: NUT, выключить ПК через N минут
Да, похоже что параметр sysctl kern.init_shutdown_timeout, то что нужно.
Система стала ожидать дальше и не вырубилась через 2 мин.
Но постигла другая неудача.
После длительной работы плохо идет корректное завершение софта.
Для примера система остановилась на остановке mysql сервера, и ждала завершения его работы минут 5, пришлось сбросить и завершить работу системы побыстрее.
Собственно с какой стороны подойти к вопросу ?
Чтио можно помониторить, посмотреть ?
Странно что проблема проявляется только на "поработавшей системе", если загрузиться (подождать пока все запустится и заработает) и запустить выключение, то все работает нормально ...
Система стала ожидать дальше и не вырубилась через 2 мин.
Но постигла другая неудача.
После длительной работы плохо идет корректное завершение софта.
Для примера система остановилась на остановке mysql сервера, и ждала завершения его работы минут 5, пришлось сбросить и завершить работу системы побыстрее.
Собственно с какой стороны подойти к вопросу ?
Чтио можно помониторить, посмотреть ?
Странно что проблема проявляется только на "поработавшей системе", если загрузиться (подождать пока все запустится и заработает) и запустить выключение, то все работает нормально ...