1. 程式人生 > >Exsi主機判斷UPS狀態自動進行關機的討論

Exsi主機判斷UPS狀態自動進行關機的討論

小公司很少有能力購買大型的UPS,但是絕大多數的小品牌UPS,都只有自己的監控程式,一般都是執行在xp系統上的,很少有能直接支援exsi的,這就有個問題,如何才能讓exsi主機在斷電的時候自動的進行判斷,然後按照設定的順序依次關閉虛擬機器然後自己關機以保護硬碟資料,這就成了一個問題

解決思路

1. 在exsi上執行一個xp虛擬機器,然後將ups的usb連線至exsi主機,並對映此usb裝置至這臺xp虛擬機器

2. 在這臺xp虛擬機器上安裝ups自帶的監控軟體,並設定如果市電斷電超過2分鐘,這臺虛擬機器就自動關機

3. 在exsi上運營一個指令碼,每隔3分鐘就ping一次這個xp虛擬機器,如果發現失敗了,就說明這個虛擬機器關機了,說明市電斷電,那麼開始依次的執行其他虛擬機器的關閉命令,並且關閉此Exsi主機

實際操作流程(參考)

1. 在Exsi上安裝xp虛擬機器(最小配置即可)和UPS監控程式,這裡跳過,每個人購買的UPS品牌不同,按照說明書設定即可。

2. 用vSphere登入Exsi主機,開啟SSH功能


開啟之後,用PuTTY登入, (可以在很多地方找到下載)

使用root賬戶登入


登入之後,會用到下面的命令

ls   //這個是列出當前目錄下的檔案

cd 目錄名   //進入某一個目錄

現在就利用上面兩個命令,進入磁碟目錄

cd vmfs/volumes

進入這個目錄之後,後面的每個人應該就不一樣了,這個時候需要使用 ls 命令


我這個機器,可以看到下面這些內容,其中這個比較亮的字,就是儲存,再次使用cd命令進入這個目錄


可以看到進入之後,目錄顯示的是上面那個字串,這個不用管他,進來了就行。然後再次使用 ls 命令,看看這個目錄下面都有啥


可以看到,這個儲存下面,是我們在這臺Exsi主機上執行的一些虛擬機器,(忽略其他的幾個,關注ups目錄)

這個“ups”目錄是我們目前需要建立的,我這個是因為已經弄好了,所以會有這個目錄,一般情況下是沒有的。

使用  “mkdir ups” 這個命令來建立一個ups資料夾,然後用  cd ups 進入此資料夾


進入之後,我們需要建立3個檔案,我分別說明一下他們三個都是什麼

apc.sh   //這個是一個可以執行的指令碼,作用是判斷xp虛擬機器是否可以ping通,如果不行,就按照這個腳本里面的內容執行exsi的關機操作

ups.log  //這個是日誌檔案,記錄apc.sh這個指令碼的執行的情況,方便日後檢視到底是什麼時間斷電的

ups_shouhu.sh  //這是一個守護,目的是判斷apc.sh是否在執行,如果沒有,就執行它

在建立這些檔案之前,我們需要先獲取一些資訊,需要知道當前主機都運行了哪些虛擬機器,以及他們的編號都是多少

vim-cmd vmsvc/getallvms  //列出當前主機所有的虛擬機器


看到類似於上面這個結果,這裡面是你當前所有這個主機上的虛擬機器,前面的Vmid就是他們的編號,記下來這個編號,後面會用到

好了,下面開始依次建立這三個檔案

在exsi下建立檔案,需要用到 vi 這個命令(這是個linux下的文字編輯器,不展開說了,想要詳細瞭解的話自己去百度即可,這裡僅僅介紹用得到的功能)

用vi建立檔案,命令是下面這個

vi apc.sh

輸入上面這個之後,就會啟動一個vi編輯器,這個時候千萬別蒙,因為從現在開始,你的鍵盤的反饋和之前是完全不一樣了,所以別隨便按任何鍵。

我下面這個檔案已經編輯完了,看上去有內容,如果是第一次建立這個檔案,實際上應該是空的,會在螢幕一側看到全是那個“~”符號


這個時候你需要首先按鍵盤上的“Insert”按鍵一次,注意看這裡,現在是“-”,當你按了“Insert”他就變成“I”了。當變成“I”的時候,意思就是可以開始編輯了。這個時候滑鼠是不管用的,需要完全使用鍵盤的上下左右來操作


拷貝下面的這段程式碼,到記事本,然後需要根據你自己的實際情況進行一些編輯,我儘量在每一行程式碼下面都做了詳細的說明, 在exsi的shell指令碼中, #後面的就是註釋,所以下面的程式碼中,所有#開頭的,就是註釋了。

#!/bin/sh
while
ping -c 1 192.168.0.4 > /dev/null #這個ip地址是你執行xp的那臺虛擬機器的ip地址,需要改成你自己的
[ $? -eq 0 ]; 
# $? 是最後一個命令執行狀態的返回標記,0代表成功,1代表失敗,這一行的作用是判斷上面的ping命令是否成功執行了
do

	echo ' AC Power OK ! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
	#意思是向後面這個檔案中寫入一句log,並且記錄當前時間,echo 的意思是向指定的io輸出一系列的字元等,
	#上面這行程式碼裡面的datastore1是我的機器路徑,需要改成你自己的,後面所有的路徑都同理

	sleep 180 #暫停180秒,這個數字是可以根據自己的實際修改

done
#上面這一段的作用是每隔180秒,就ping一次xp虛擬機器的ip如果成功了,那麼就向log裡面寫入一條記錄然後一直迴圈下去
#如果上面這一段執行失敗了,也就是說ping命令沒有成功執行,那麼就停止迴圈,開始執行下面的程式碼

echo ' AC Power maybe off, checking again after 1 minutes ! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
#向log檔案中寫入這次異常並記錄時間

sleep 60
#等待60秒,可以根據你自己的需要修改

ping -c 1 192.168.0.4 > /dev/null
#ping那個執行xp的虛擬機器

if [ $? -eq 0 ] 
#判斷上面這個ping語句是否執行成功了,如果成功了則執行then後面這句程式碼並結束此指令碼
#如果上面這次ping失敗了,那就說明在前面那個迴圈失敗之後60秒再次嘗試,又失敗了,說明應該是關機了開始執行else後面的程式碼
then
	echo ' Checkagain, AC Power OK ! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
	#
else

	echo ' AC Power is already off, shut down Esxi Now! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
	#向log檔案中寫入,市電已經斷掉了,現在開始執行關機
	
	vim-cmd vmsvc/power.shutdown 12
	#這是一個關鍵的命令,這個exsi用來關閉虛擬機器的命令列,後面的數字,就是剛剛我們前面說的Vmid
	#也就是說,想要關閉哪臺虛擬機器,就寫哪個數字
	
	Sleep 300
	#暫停300秒,主要是關閉虛擬機器需要時間,所以在這裡要停一停等一下再關閉exsi主機,可以根據你的經驗和UPS的容量自行調整時間
	
	/bin/shutdown.sh #關閉exsi主機
	halt
fi #是和上面的if對應的,語法需要,不用在意

將上面這些程式碼,拷貝到記事本,根據自己的實際需求進行編輯修改之後,再拷貝,然後到剛剛的PuTTY視窗,那個視窗現在應該是vi編輯器,這個時候在視窗中按滑鼠的右鍵,就應該直接將程式碼黏貼上了。黏貼之後,應該是類似於下面這樣的


這個時候需要儲存這個檔案,首先按一下esc, 然後按一下“:”這個時候游標會跑到最下面,等待你輸入,輸入“w”然後回車,是儲存這個檔案, 然後再按“:”輸入“q”回車,退出vi編輯器


這個時候你再用“ls”命令,應該可以看到一個apc.sh檔案,但是你的這個檔案可能和我的不太一樣,不是綠色的,因為他現在還不是可執行檔案,沒有許可權,需要用下面的這個命令來給它一個執行許可權,

chmod 777 apc.sh

執行完上面的命令之後,再用“ls”命令看,應該就是綠色的了。

然後用相同的方法,建立ups.log檔案,只不過這是一個空檔案,不容寫內容

下面一步是建立一個守護,來判斷apc.sh是否正在執行中,如果沒有執行,就執行它。

NUM=`ps -c | grep apc.sh | grep -v grep |wc -l`
echo ${NUM}
#
if [ "${NUM}" -lt "1" ];then
/vmfs/volumes/datastore1/ups/apc.sh &
echo ' UPS shouhu start' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
fi
exit 0

同樣的原理,將這段程式碼中, 路徑的 “datastore1”換成你自己的路徑,其他不用變

下面我們建立一個計劃任務,每3分鐘執行這個守護程式一次,這個時候需要用到exsi下面的計劃任務程式,叫“cron”(別問這是啥,如果你不知道沒關係,只要按照下面的步驟做就可以了,這個就是一個類似於win的計劃任務的東西)

首先用下面的命令開啟這個計劃任務的列表檔案

vi /var/spool/cron/crontabs/root

這個時候vi編輯器就打開了一個檔案


你看到的和我看到的應該差不多,但是沒有最下面這一行,用上面說的編輯方法,將這一行內容新增進去,注意“datastore1”要改成你自己的路徑,然後儲存、退出

這個時候已經完成了99%了,唯一的問題是,當exsi重啟之後,它會重置這個計劃任務,這個檔案裡面的內容又擦除掉了,所以我們需要讓它每次啟動的時候,都將這句話自動的寫在這個檔案裡面,下面介紹

首先用下面的命令進入 ect目錄

cd /etc

因為rc.local 是隻讀檔案,現要修改一下許可權

chmod 777 rc.local

然後用vi編輯器開啟rc.local檔案

vi rc.local

在開啟的檔案的最下面加上下面三行程式碼(將datastore1路徑改為你自己的)

/bin/kill $(cat /var/run/crond.pid)
/bin/echo '*/3 * * * * /vmfs/volumes/datastore1/ups/ups_shouhu.sh' > /var/spool/cron/crontabs/root
/bin/busybox crond

然後儲存退出

驗證一下 apc.sh是否在執行。使用下面這行,如果結果是“1”,就說明正在執行中

ps -c | grep apc.sh | grep -v grep |wc -l

看看日誌檔案是否正常記錄了。(先要進入到ups.log所在的目錄,方法看前面)

cat ups.log

希望這個對大家有幫助,網上看了很多文章都沒有留聯絡方式,有些問題想要問問作者也不知道找誰,我留個聯絡方式吧,有問題可以給我發郵件 [email protected] 我看到的話儘量解答。


相關推薦

Exsi主機判斷UPS狀態自動進行關機的討論

小公司很少有能力購買大型的UPS,但是絕大多數的小品牌UPS,都只有自己的監控程式,一般都是執行在xp系統上的,很少有能直接支援exsi的,這就有個問題,如何才能讓exsi主機在斷電的時候自動的進行判斷,然後按照設定的順序依次關閉虛擬機器然後自己關機以保護硬碟資料,這就成了一

solaris主機 UFS文件系統進行擴容

solaris 擴容 ufs 1.存儲劃分空間給主機2.登入主機進行掃盤 #devfsadm -cv 或者 devfsadm -c disk #dmesg 顯示的信息與more /var/adm/messages 中的信息一致 # devfsadm -c

二維碼快速掃碼優化方案介紹(一)--怎麽在光線不足時,手機自動進行補光。

ram 平時 implement chang fill change rri ren text 二維碼掃碼已經是一個很通用的技術了,也有很多的開源項目可以實現,比如Zxing項目。https://github.com/zxing 這裏重點不是介紹Zxing中是怎麽樣來實現二

如何查詢HP-UX主機防火墻狀態

如何查詢hp-ux主機防火墻狀態由於連接HP-UX中的數據庫1521商品無法telnet通,判斷是不是因為HP-UX防火墻導致1521端口,所以想如何在HP-UX中安裝防火墻以及查詢防火墻狀態使用主機防火墻可以很方便的對網絡訪問進行訪問控制,同時對於很多的攻擊手段有著良好的防禦作用。使用HPUX主機防火墻(I

電腦自動關機軟件

電腦 開關機 定時關機 電腦自動開關機軟件:http://www.3322.cc/soft/35872.html電腦自動開機軟件是一款簡單實用的電腦開關機工具,可幫助用戶實現任意多次定時開機和關機等多種自動化功能。通過它,用戶可自定義在某個時間內自動開機或關閉電腦,如在設置自動開機的過程中,用戶可

部署vsphere vcenter接管exsi主機

vsphere vcenter參考鏈接:http://blog.51cto.com/1130739/1794685 VMware VCSA6.0的部署及升級到6.5http://blog.51cto.com/1130739/1794685部署vsphere vcenter接管exsi主機

判斷網路狀態

package com.example.wifinetworkdemo.util; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo

判斷WIFi狀態的NetUtils

public class NetUtils { public static boolean isConnected() { ConnectivityManager connectivity = (ConnectivityManager) MyApplication.sCon

js判斷網路狀態

一般來說判斷網路狀態都是用的h5提供的navigator去判斷、專案一般這樣去用 if(!navigator.onLine){ e.stopPropagation(); layer.msg('網路未連線,請檢查重試',{time:3000,icon:5}); return; }

判斷地瓜狀態

class Di(): def init(self): self.time = self def __str__(self): if self.time <= 3: self.zt = '生的'

javaEE Springmvc,Converter型別轉換器,對請求引數自動進行型別轉換/處理(轉成Date日期型別)

src/springmvc.xml(Springmvc核心配置檔案,配置型別轉換器,為介面卡指定轉換器): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

判斷Wifi狀態是否可用

獲取網路資訊需要在AndroidManifest.xml檔案中加入相應的許可權。 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />1)判斷是否有網路連線

一行命令實現多渠道打包並自動進行資源混淆(Walle,AndResGuard)

多渠道打包和資源混淆的作用這裡我就不再闡述了。網上有很多。 本篇部落格我們來介紹一下如何實現多渠道打包之前先進行資源混淆,這樣一來我們打出來的包都是已經進行過資源混淆的了。 如果你還有其他的需求,也可以按照這個方法實現。 多渠道打包(Walle) 這裡多渠道打包

sql對同一個欄位不同狀態分別進行統計數量

<!-- 統計供應商會員數量 -->      <select id="sel_deal_sum_data" parameterClass="java.util.Map" resultClass="com.forlink.fkcore.dat

vmware vsphere 5.1 vcenter中 exsi主機使用電子郵件接收預警資訊

何使用vCenter中電子郵件傳送EXSI主機預警資訊,有點時間一直困擾著,經過參考及資料查詢,現將解決方法貼出,以備參考 第一、 第二、 第三、測試,事先定義一個較小的告警值,這裡不細說,這邊展示效果如下:

php實現例項化類後自動進行錯誤以及異常處理(簡易版)

<?php class App { public function __construct() { /* * ini_set 設定配置項 * display_errors 是否在頁面顯示錯誤資訊 *

Angular解決輸入框由禁用狀態轉可用狀態自動獲取焦點失效問題

有時為了方便操作,我們會為輸入框設定預設焦點。而且會設定輸入許可權,會禁止使用者輸入。 但是當從禁止輸入切換為可輸入的時候,輸入框卻不能設定焦點了。 原因的話,我看了一下,估計是當我們改變輸入框繫結的值得時候,輸入框並沒有切換狀態,還是禁用狀態,所以我們無法

android判斷網路狀態

在清單檔案中新增許可權 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission and

Android AlarmManager 定時鬧鐘實現在CPU休眠狀態進行業務操作

首先,完全沒必要擔心AP休眠會導致收不到訊息推送。通訊協議棧運行於BP,一旦收到資料包,BP會將AP喚醒,喚醒的時間足夠AP執行程式碼完成對收到的資料包的處理過程。其它的如Connectivity事件觸發時AP同樣會被喚醒。那麼唯一的問題就是程式如何執行向伺服器傳送心跳包的邏輯。你顯然不能靠AP來做心跳計時。

使用poi只能判斷2003和2007進行資料讀取

import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.ut