用PowerShell監控磁碟空間
在伺服器上經常會執行一些程式,這些程式或多或少都會需要將一些執行的過程記錄在log檔中。如果沒有定期去清除這些log檔的話,時間一久伺服器上的磁碟空間就會被用光。
不過,因為是伺服器上的自動排程程式,所以一般人一旦設定好就不再會去管理。久而久之可能就在某一天發生磁碟空間不足,造成程式無法執行的問題。
我想要監控伺服器的磁碟空間的應用程式應該是不少,不過最好的方式當然是能用Windows Server本身內建的功能是最好。
最近微軟提供了PowerShell的指令集工具。這個工具有很多的伺服器管理功能。當然也可以用來監控磁碟空間了。找了一下網路上,果然有人在分享已寫好的用PowerShell監控磁碟空間的程式碼。
即然有現成的當然就拿來改一下使用看看囉。
要執行的話,需要在PowerShell的命令列視窗中輸入 .\。要加個「.\」。不然,直接打檔名是無法執行的。
如果第一次執行有問題的話,應該也是安全性的問題。就要先執行以下的指令:
Set-ExecutionPolicy RemoteSigned
如果你的WinServer 2008找不到PowerShell,是因為預設上是沒安裝的,請自行由伺服器管理員安裝PowerShell。
如果直接用命令列執行PowerShell指令檔,而不用先進入PowerShell的方式如下:
powershell -command "& './CheckQuota.ps1'"
原本的版本中只能寄警告信通知一位管理員,後來我修改了一下,可以讀取一份清單,以便將警告訊息傳給多位管理員。程式碼如下:
PowerShell參考資料:
[1] 一些使用技巧
不過,因為是伺服器上的自動排程程式,所以一般人一旦設定好就不再會去管理。久而久之可能就在某一天發生磁碟空間不足,造成程式無法執行的問題。
我想要監控伺服器的磁碟空間的應用程式應該是不少,不過最好的方式當然是能用Windows Server本身內建的功能是最好。
最近微軟提供了PowerShell的指令集工具。這個工具有很多的伺服器管理功能。當然也可以用來監控磁碟空間了。找了一下網路上,果然有人在分享已寫好的用PowerShell監控磁碟空間的程式碼。
即然有現成的當然就拿來改一下使用看看囉。
要執行的話,需要在PowerShell的命令列視窗中輸入 .\
如果第一次執行有問題的話,應該也是安全性的問題。就要先執行以下的指令:
Set-ExecutionPolicy RemoteSigned
如果你的WinServer 2008找不到PowerShell,是因為預設上是沒安裝的,請自行由伺服器管理員安裝PowerShell。
如果直接用命令列執行PowerShell指令檔,而不用先進入PowerShell的方式如下:
powershell -command "& './CheckQuota.ps1'"
原本的版本中只能寄警告信通知一位管理員,後來我修改了一下,可以讀取一份清單,以便將警告訊息傳給多位管理員。程式碼如下:
$computers=(Get-Content CheckComputerList.txt)
#單位是MB
$WARING='5000000000'
$SMTP='email.polaris.com.tw'
$TO='justin_Lin@polaris.com.tw;justin1021@gmail.com'
$FROM='FMSQLAdmin@polaris.com.tw'
$MonitorList=(Get-Content MonitorManager.txt)
foreach ($computer in $computers)
{
#$ICMP=get-wmiobject -query "select * from win32_pingstatus where address='$COMPUTER'"
$ICMP=get-WmiObject Win32_PingStatus -filter "Address='$COMPUTER' "
#justin
#..Write-Output $ICMP
if ($ICMP.StatusCode -eq '0')
{
#justin
#..Write-Output "Check '$COMPUTER'"
#..Get-WmiObject -computer $COMPUTER win32_logicaldisk
Get-WmiObject -computer $COMPUTER win32_logicaldisk |? {$_.drivetype -eq '3'}|%{
if (([int64]($_.freespace/1MB)) -le "$WARING")
{
#justin
#..Write-Output "Waring '$COMPUTER' '$_.freespace'"
$ID=$_.deviceid
$F=[int32]($_.freespace/1MB)
$S="Waring $computer disk $ID Freespace $F MB"
foreach( $Monitor in $MonitorList )
{
Send-MailMessage -to $Monitor -from $FROM -subject "$S" -body "$S" -smtp $SMTP
}
}
}
}
else
{
$N="Waring $computer not respond !"
Send-MailMessage -to $TO -from $FROM -subject "$N" -body "$N" -smtp $SMTP
}
}
PowerShell參考資料:
[1] 一些使用技巧
留言
張貼留言