Так сложилось что некоторые вирт.машины виснут или сами выключаются. И мне это надоело. Решил немного по велосипедить так сказать вот что из этого получилось.

Создаем два скрипта и один текстовый файлик все это помещаем в каталог /etc/pve/vm-test/ почему сюда, дело в том что если у вас кластер то внесенные изменения в эти файлы сразу отразятся на всех нодах и не нужно переживать что если вирт.машина мигрировала на другую ноду то она и там промониторится. Также мониториться lxc контейнеры. Можно использовать и на отдельной ноде. Ну начнем

Первый скрипт читает из файла ip адрес и номер вирт.машины и запускает второй скрипт.

/etc/pve/vm-test/vm-status.sh

#!/bin/sh
FILE="/etc/pve/vm-test/vm_ip.txt"
#echo $FILE
while read LINE; do
    #echo "Это строка: $LINE"
    IP=`echo $LINE|awk '{print $1}'`
    VMID=`echo $LINE|awk '{print $2}'`
    #echo $IP
    #echo $VMID
    `sh /etc/pve/vm-test/vm-reset.sh $IP $VMID`
done < $FILE

Второй скрипт по сложней, он проверяет принадлежит ли нам вирт.машина если да и она имеет статус running т.е. не остановлена админом то проверяем ping и если его нет то жёстко выключаем вирт.машину и запускаем по новой.

/etc/pve/vm-test/vm-reset.sh

#!/bin/sh
DSTIP=$1
VMID=$2
HOST=`/bin/hostname`

VMVIRT=`/bin/cat /etc/pve/.vmlist |/bin/grep $HOST|/bin/grep "\"$VMID\""|/usr/bin/tr -d \"|/usr/bin/tr -d ,|/usr/bin/awk '{print $4" "$6}'`

if [ -n "$VMVIRT" ]
then
    VMHOST=`echo $VMVIRT|/usr/bin/awk '{print $1}'`
    VMVIR=`echo $VMVIRT|/usr/bin/awk '{print $2}'`
else
    #echo "$0 ip-addres vm-id "
    exit
fi

if [ $VMVIR = "qemu" ]; then
{
    RUN=`qm status $VMID|grep -i "running"|wc -l`
}
else
{
    RUN=`lxc-info $VMID|grep -i "running"|wc -l`
}
fi

if [ $RUN = 0 ];then
{
    exit
}
fi

ICMP=`ping -c 2 $DSTIP |grep packets|awk '{print $4}'`

if [ $ICMP = 2 ]; then
{
    #echo 'Машина работает'
    exit
}
fi
if [ $ICMP = 0 ];then
{
    #echo 'Машина не отвечает'
    if [ $VMVIR = "qemu" ]; then
    {
        #echo 'Машина qemu'
        /usr/sbin/qm stop $VMID
        sleep 20
        /usr/sbin/qm start $VMID
        exit
    }
    else
    {
        #echo 'Машина lxc'
        pct stop $VMID
        sleep 20
        pct start $VMID
        exit
    }
    fi
}
fi
exit

 

Ну и сам файлик с данными ip-адрес id-вирт.машины на одной строке вторая и т.д. на новой строке.

/etc/pve/vm-test/vm_ip.txt

192.168.28.177 101
192.168.28.10 102

 Осталось только на всех нодах в кластере прописать в crontab строчку запуска первого скрипта. Но тут есть одно но если нода только поднялась то не все что на ней висит (вирт.машины) сразу запустится и ответят на ping так что через какой промежуток запускать данный скрипт решать вам. У меня раз в полчаса.

*/30 * * * * root sh /etc/pve/vm-test/vm-status.sh

Ну вот и все хоть и костыль но работает. Кому поможет кому нет.