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.sh
和sh 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无法访问,发短信/邮件告警,真正做到千里之外感知到家里断电及恢复时间。