三千年读史无外乎功名利禄,九万里悟道终归是诗酒田园。

UPS与ESXI联动实现断电自动关机 - 守护进程与NOHUP实现

ESXi是广为人知的商业虚拟化软件,只有少部分高级UPS才能适配这种企业级软件,普通UPS要做到关机,需要使用脚本联动完成,一旦检测到某个action,就触发或延时触发关机动作(UPS还能撑几十分钟),避免文件系统、硬盘、电源等损坏,得不偿失,同理,只要有类似脚本功能的设备只要插上UPS,都能做到断电自动关机的功能,而UPS本身高度支持的设备可通过数据通信线及后台配置即可,相对方便些,如群晖NAS。

一、开启ESXI的ssh功能,并ssh登录ESXI创建ups脚本

1.进入到ESXI web控制台,开启ssh功能

2.ssh连接到ESXI,创建必要文件及脚本

脚本逻辑:每1分钟ping一次指定IP,每次只ping一次,如果达到2次,三分钟后再ping一次,此时如果还是不通,就记录时间写入日志到ups.log,并执行关机命令,具体时间和逻辑你可以随意更改:

[root@localhost:~] cd /vmfs/volumes/data   #cd到对应硬盘卷,以你的硬盘命名为准
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187]mkdir ups
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187]cd ups
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]touch ups.log  #写日志用
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]vim ups.sh  #创建以下脚本
#!/bin/sh 
UPS_LOG=/vmfs/volumes/data/ups/ups.log
count=0
IP=192.168.1.200   # 写网关IP,或只要是断电ping不通的IP都行
while :;do
ping -c 1 $IP > /dev/null
if [ $? -eq 0 ]; then
        :
else
        count=$(expr $count + 1);
fi

sleep 60

if [ $count -ge 2 ]; then
        echo "$(date) AC Power maybe off, checking again after 3 minutes ! " >> $UPS_LOG
        sleep 180
        ping -c 1 $IP &>/dev/null
        if [ "$?" -eq 0 ]; then
                echo "$(date) Checkagain, AC Power OK ! " >> $UPS_LOG
        else
                echo "$(date) AC Power is already off, shut down ESXi Now! " >> $UPS_LOG
                /bin/shutdown.sh
                halt
        fi

else

        continue

fi
done
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]chmod +x ups.sh  #给个执行权限就行,没必要777
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]

3.验证脚本是否生效

ESXI的sh是链接到busybox的,相当于裁剪版bash,所以语法不可能和bash完全一样:

前面加过执行权限了,./ups.shsh ups.sh都行,为了看到脚本处理逻辑,加个-x参数:

ping是通的,所以$_上一个命令的返回码为0,对标表达式,满足条件,:占位符表示什么都不做,休眠60秒后继续ping,此时说明脚本正常,如果你想看到整个脚本处理逻辑,ping一个不通的IP即可。

二、守护进程与NOHUP

这里有两种方式,一种是守护进程,一种是nohup+后台运行,写入到开机自启脚本,两种方式选一种即可

1.守护进程方式

所谓守护进程,顾名思义,就是守护它要守护的进程,如何实现?最简单的守护进程就是间隔指定时间去检查进程是否正常运行,没有在运行就调用启动脚本或命令让进程运行起来,一直守护它整个生命周期。

[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]vim ups_daemon.sh  #写入以下脚本
#!/bin/sh

result=$(ps -c |awk '!/awk/&&/ups.sh/{print}'|wc -l)  #通过awk和wc判断进程是否在运行

if [ "${result}" -lt "1" ]; then

        /vmfs/volumes/data/ups/ups.sh &
        echo "$(date) UPS daemon process running" >> /vmfs/volumes/data/ups/ups.log

fi
exit 0
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]

写入到开机自启:

[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]cat /etc/rc.local.d/local.sh
/bin/kill $(cat /var/run/crond.pid)
/bin/echo '*/3  *  *  *  *   /vmfs/volumes/data/ups/ups_daemon.sh' >> /var/spool/cron/crontabs/root
/bin/crond
exit 0
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]

ESXI的crond进程重启后会把写入的定时任务清空,只保留系统的,写到开机自启脚本以确保每次重启在crond里面有守护进程任务,每三分钟执行一次守护进程脚本,也就是每三分钟判断一次ups.sh脚本是否在正常运行。

2.NOHUP方式

懒人专用,一条命令即可,开机或重启后自动运行:

[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]vim /etc/rc.local.d/local.sh #写入以下内容
{ nohup sh /vmfs/volumes/data/ups/ups.sh; } &>/dev/null & #nohup后台运行脚本,并禁止在控制台输出stdout或stderr,禁止输出文本
[root@localhost:/vmfs/volumes/5f174c56-6a79f5cc-c990-a03e6ba0a187/ups]

使用此方式后只有下次开机才会运行脚本,为了不重启直接运行一遍即可:

{ nohup sh /vmfs/volumes/data/ups/ups.sh; } &>/dev/null &

3.确保进程在后台正常运行

这个就不用过多赘述了,ps命令直接看,和其他linux发行版的ps入参有些不一样:

到此,整个UPS和ESXI联动已经做完,可反复断电测试,一劳永逸;如果你本地做了DDNS,可以配合dnspod的D监控功能,一旦感知到IP:PORT或URL无法访问,发短信/邮件告警,真正做到千里之外感知到家里断电及恢复时间。

赞(11)
转载请注明出处:RokasYang's Blog » UPS与ESXI联动实现断电自动关机