На ноутбуке стоит система мониторинга Zabbix, которая обучена отсылке SMS-сообщений.
Необходимо знать из первых уст, так сказать, что пропало внешнее питание.
Если ядро собрано с поддержкой ACPI и запущен демон devd, то при подключении/отключении внешнего питания будет генерироваться событие типа notify от подсистемы ACAD, системы ACPI. По умолчанию на это событие назначен скрипт, изменяющий профиль питания, но ничего не мешает добавить дополнительное действие:
1 2 3 4 5 6 |
notify 10 { match "system" "ACPI"; match "subsystem" "ACAD"; action "/etc/rc.d/power_profile $notify"; action "/usr/local/etc/acpi_power_mon.sh $notify &"; }; |
/etc/rc.d/power_profile — это дефолтовый скрипт, /usr/local/etc/acpi_power_mon.sh — наш сцеарий. Амперсанд нужен для того, чтобы скрипт оставался запущенным и не мешал devd.
В самом скрипте, при пропадении питания создаём pid-файл, сообщаем по SMS куда следует, пишем в лог и запускаем цикл проверки заряда батареи. В случае падения заряда ниже min_cap, шлём смску, ждем 2 минуты и выключаемся.
Если питание появится до отключения сервера, убиваем процесс ранее запущенного скрипта и отсылаем SMS.
SMS отправляются по номерам, указанным через пробел в переменной numbers, но т.к. в Zabbix уже есть список номеров, логичней воспользоваться им.
В запросе выбираются номера пользователей, состоящих в группе «Zabbix Super Admin» и имеющих возможность уведомления по SMS.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#!/bin/sh name="acpi_power_mon" pidfile="/var/run/$name.pid" min_cap="30" smsscript="/usr/local/etc/zabbix3/zabbix/alertscripts/sendsms.sh" numbers=$(echo "SELECT sendto from media,users WHERE users.type=3 AND media.mediatypeid=4 AND media.userid=users.userid;" | mysql zabbix | grep -E "[1-9]{1,11}") case "$1" in "start" | 0x00) if [ -f $pidfile ] then logger -p local0.notice -t acpi_power_mon "$pidfile is allready exists" exit else echo $$ > $pidfile logger -p local0.notice -t acpi_power_mon "AC power loss" for i in $numbers; do $smsscript $i "Zabbix server AC power loss" done; fi;; "stop" | 0x01) if [ -f $pidfile ] then kill $(cat $pidfile) rm $pidfile logger -p local0.notice -t acpi_power_mon "AC power restored" for i in $numbers; do $smsscript $i "Zabbix server AC power restored" done; else logger -p local0.notice -t acpi_power_mon "$pidfile is not exists" fi; exit;; esac while [ 1 ] do cur_cap=$(acpiconf -i0 | awk '{if($1=="Remaining" && $2=="capacity:")print int($3)}') if [ $cur_cap -lt $min_cap ] then for i in $numbers; do $smsscript $i "Zabbix server shutting down by battarey discharge" done; sleep 120 rm $pidfile logger -p local0.notice -t acpi_power_mon "Shutting down" shutdown -p now exit fi sleep 60 done |