Добрый день! Имеется сервак(centos 7) в офисе + ups must 3000VA с консольным СОМ портом. Все это дело подключил друг к другу и установил nut. На сервере имеется kvm, на котором крутятся машинки windows и linux. Собственно задача: при выключении света упс дает сигнал что она работает от батарей, потом когда разряд доходит до минимума посылает команду nut-monitor который в свою очередь выполняет скрипт выключения машинок и выключения хост машины. Собственно вся проблема в том что именно windows машины получая сигнал выключения зависают и не хотят выключатся. Что было сделанно:
установил груповые политики в windows, чтобы выключался сервер не входя в систему и не выводиk окошко о том как завершить работу сервера. Установил в реестре значение ShutdownWarningDialogTimeout=00000001
не помогло
установил настройки в файле /etc/sysconfig/libvirt-guests
ON_SHUTDOWN=shutdown
PARALLEL_SHUTDOWN=1
SHUTDOWN_TIMEOUT=90
не помогло
конфиг /etc/ups/ups.conf
[Must]
driver = blazer_ser
port = /dev/ttyS0
desc = "server"
offdelay = 300
ondelay = 0
конфиг /etc/ups/upsmon.conf
RUN_AS_USER nut
MONITOR Must@localhost 1 monuser password master
MINSUPPLIES 1
SHUTDOWNCMD "sudo /etc/ups/shutdown.sh --shutdown"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/ups/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 0
конфиг /etc/ups/upsd.users
[monuser]
password = password
actions = SET
instcmds = ALL
upsmon master
ну и сам скрипт выключения
#!/bin/bash
shutdown_quests(){
LIST_VM=`virsh list | grep running | awk '{print $2}'`
TIMEOUT=90
DATE=`date -R`
LOGFILE="/etc/ups/kvm-quest-shutdown.log"
if [[ ! -e $LOGFILE ]]; then
touch $LOGFILE
#echo "$LOGFILE created" 1>&2
elif [[ ! -d $LOGFILE ]]; then
echo "$DATE : Start script" >> $LOGFILE
fi
for activevm in $LIST_VM
do
PIDNO=`ps ax | grep $activevm | grep kvm | cut -c 1-6 | head -n1`
echo "$DATE : Shutdown : $activevm : $PIDNO" >> $LOGFILE
virsh shutdown $activevm > /dev/null
COUNT=0
while [ "$COUNT" -lt "$TIMEOUT" ]
do
ps --pid $PIDNO > /dev/null
if [ "$?" -eq "1" ]
then
COUNT=110
else
sleep 5
COUNT=$(($COUNT+5))
fi
done
if [ $COUNT -lt 110 ]
then
echo "$DATE : $activevm not successful force shutdown" >> $LOGFILE
virsh destroy $activevm > /dev/null
fi
done
}
note(){
echo -e "--------------------------------------------------------\n"
echo -e "\nYou need usage script with arguments: --reboot ot --shutdown:\n\n $0 --shutdown\n"
exit 1
}
reboot_node(){
reboot
}
shutdown_node(){
systemctl poweroff -i
}
if [ $# -ne 1 ]; then
note
fi
for i in "$@" ; do
if [[ $i == "--reboot" ]] ; then
shutdown_quests
reboot_node
break
fi
if [[ $i == "--shutdown" ]] ; then
shutdown_quests
shutdown_node
break
fi
done
изменил sudo файл
Defaults !requiretty
nut ALL=(ALL) NOPASSWD: /etc/ups/shutdown.sh
Подскажите что я делаю нее так?! Почему при обычном systemctl poweroff -i машинки не выключаются а уничтожаются kvm? Заранее всем спасибо
удалось найти службу, которая следит за гостевыми машинами, libvirt-guests.service, запустил ее. Теперь если ее остановить, то машинки выключаются как положено. А если послать сигнал выключения хост машине, то выключение не дожидается окончания выключения гостевых машин. Попробую сделать скрипт, который будет останавливать службу libvirt-guests.service, проверять не осталось ли запущеных машин и выключать хост машину