背景:我是一名开发人员,不情愿地“照看”部署应用程序的机器。我的客户是一家完全独立的公司,他们付钱让我们为他们编写代码 - 我们没有共同的老板或类似的东西。他们有系统管理员,但他们在不同的部门,当他们要求做一些我认为系统管理员应该能够为他们做的事情时,他们没有得到他们所要求的。实现这一点不是我能控制的。然后我最终被要求编写代码来做一些事情,我怀疑一个真正受过训练的人可以用几行 powershell 或在对话框中勾选某些东西来设置。这是安装了 SQL 和 IIS 的 Windows Server 2003 设置。
这导致了今天的问题:如何知道驱动器已满。(数据库增长、导出的文件未清理,诸如此类。)理想情况下,会发出一封电子邮件,说明“驱动器 E 位于 xyz 的 abc(84%)”。这容易做到吗?我当然不想编写一个服务来监控磁盘空间并发送电子邮件 - 一定有人以前做过这件事。其中一个驱动器实际上是一个映射驱动器,代表另一台机器上的文件夹。
答案1
虽然许多答案都包括脚本(如果你选择这种方式,我也会建议使用 powershell),但你也可以使用 perfmon 执行警报。请参阅如何使用 Windows Server 2003 中的性能日志和警报功能配置磁盘空间不足警报
请注意,您要采取的操作是执行 powershell 或 vbscript 来向您发送电子邮件(或者可能更可取的是,在驱动器上执行一些基本的清理任务,然后发送一封电子邮件说明问题是什么以及操作后编号是什么)
对于映射驱动器,您必须使用脚本。在 WMI 计数器中要使用的为 win32_mappedlogicaldisk。(Get-WmiObject win32_mappedlogicaldisk).freespace。例如:
$mythreshold = 10GB
Get-WmiObject win32_mappedlogicaldisk | select-object deviceid, freespace | foreach {
if ($_.freespace -lt $mythreshold){
$from = "[email protected]"
$to = "[email protected]"
$subject = "Low Disk Space!"
$body = "Free Space Remaining: " + $_.FreeSpace + "Drive" + $_.deviceid
$smtpServer = "smtp.mycompany.com"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($from,$to,$subject,$body)
}
}
(之前的大部分代码都是从 squillman 那里复制过来的,否则我就得自己输入这些代码了)
答案2
如果您运行的是 Server 2003 R2,则可以访问文件服务器资源管理工具。这允许创建带有通知的目录配额。您会对软配额感兴趣,因为它不会阻止添加新数据。您可以添加通知,以便在超过预设阈值时提醒您。
如果您使用的是不带 R2 的 Server 2003,那么您将进入外部监控工具或脚本的领域。
答案3
这可能对你有用。如果你创建一个脚本(我推荐使用 Powershell),在运行时检查可用磁盘空间,如果低于阈值则发送电子邮件,你可以在运行该脚本的服务器上创建一个计划任务。每隔 X 分钟安排一次,你就得到了一个穷人的监控解决方案。不可否认,它比其他解决方案(如 Nagios 或 R2 的资源管理器)更容易出错,但是嘿...
您的 Powershell 脚本可能看起来像这样:
$freeSpaceThreshold = 5GB
$computerName = "mycomputer"
$drive = "C:"
$driveData = Get-WmiObject -class win32_LogicalDisk -computername "$computerName" -filter "Name = '$drive'"
if ($driveData.FreeSpace -lt $freeSpaceThreshold)
{
$from = "[email protected]"
$to = "[email protected]"
$subject = "Low Disk Space!"
$body = "Free Space Remaining: " + $driveData.FreeSpace
$smtpServer = "smtp.mycompany.com"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($from,$to,$subject,$body)
}