ESXi是广为人知的商业虚拟化软件,只有少部分高级UPS才能适配这种企业级软件,普通UPS要做到关机,需要使用脚本联动完成,一旦检测到某个action,就触发或延时触发关机动作(UPS还能撑几十分钟),避免文件系统、硬盘、电源等损坏,得不偿失,同理,只要有类似脚本功能的设备只要插上UPS,都能做到断电自动关机的功能,而UPS本身高度支持的设备可通过数据通信线及后台配置即可,相对方便些,如群晖NAS。
脚本逻辑:每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 IP=192.168.1.200 # 写你的网关IP,只要是断电ping不通的IP都行 while :;do ping -c 1 $IP > /dev/null UPS_LOG=/vmfs/volumes/data/ups/ups.log 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 NAS 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]
ESXI的sh是链接到busybox的,相当于裁剪版bash,所以语法不可能和bash完全一样:
前面加过执行权限了,./ups.sh
和sh ups.sh
都行,为了看到脚本处理逻辑,加个-x参数:
ping是通的,所以$_
上一个命令的返回码为0,对标表达式,满足条件,:
占位符表示什么都不做,休眠60
秒后继续ping,此时说明脚本正常,如果你想看到整个脚本处理逻辑,ping一个不通的IP即可。
这里有两种方式,一种是守护进程,一种是nohup+后台运行,写入到开机自启脚本,两种方式选一种即可
所谓守护进程,顾名思义,就是守护它要守护的进程,如何实现?最简单的守护进程就是间隔指定时间去检查进程是否正常运行,没有在运行就调用启动脚本或命令让进程运行起来,一直守护它整个生命周期。
[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脚本是否在正常运行。
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 &
这个就不用过多赘述了,ps命令直接看,和其他linux发行版的ps入参有些不一样:
到此,整个UPS和ESXI联动已经做完,可反复断电测试,一劳永逸;如果你本地做了DDNS,可以配合dnspod的D监控功能,一旦感知到IP:PORT或URL无法访问,发短信/邮件告警,真正做到千里之外感知到家里断电及恢复时间。
本文转载自网络,原文链接:https://mp.weixin.qq.com/s/vlOUg46B5bcmToX-fjavJQ...
中国最?好的一朵云飘进了华瑞银行。阿里云将进一步助力华瑞银行All in Cloud。 -...
很长时间没有更新原创文章了,但是还一直在思考和沉淀当中,后面公众号会更频繁...
定义 this是函数运行时自动生成的内部对象,即调用函数的那个对象。(不一定很准...
查看表结构,sbtest1有主键、k_1二级索引、i_c二级索引 CREATE TABLE `sbtest1` ...
一、PostgreSQL行业位置 一 行业位置 首先我们看一看RDS PostgreSQL在整个行业当...
9月17日,2020云栖大会上,阿里云正式发布工业大脑3.0。 阿里云智能资深产品专家...
在TOP云(zuntop.com)科技租赁过服务器的站长都知道独立服务器在价格上比VPS主...
最近,DevOps的采用导致了企业计算的重大转变。除无服务器计算,动态配置和即付...
2020年对于云计算行业来说是突破性的一年,因为公共云供应商增加了收入,而疫情...