PowerShell脚本实现Windows文件夹新文件写入时间监控需求
监控Windows缓存目录文件写入活动(适配Checkmk)
由于目标目录是缓存目录,文件会被重命名、转移,无法依赖目录本身的写入时间或当前目录内的文件记录活动,我们可以通过持久化记录最新文件写入时间的方式实现监控,以下是具体的PowerShell脚本方案:
核心脚本实现
创建一个PowerShell脚本(例如Check-CacheFolderActivity.ps1),逻辑是将每次检测到的最新文件写入时间存储到一个独立的日志文件中,以此追踪历史活动,而不依赖当前目录内的文件:
# 配置参数 $monitorFolder = "C:\Path\To\Your\Cache\Folder" $lastActivityLog = "C:\Checkmk\Logs\LastCacheActivity.log" # 选一个不会被清理的路径 $alertThresholdHours = 24 # 1天=24小时 $alertMessage = "CRITICAL: 缓存目录已超过1天无新文件写入" $okMessage = "OK: 缓存目录最近24小时内有文件写入" # 初始化日志文件(如果不存在) if (-not (Test-Path $lastActivityLog)) { Get-Date -Format "yyyy-MM-dd HH:mm:ss" | Out-File $lastActivityLog -Encoding utf8 } # 获取当前目录所有文件的最后写入时间,取最新的 $latestFileWriteTime = Get-ChildItem -Path $monitorFolder -File -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty LastWriteTime # 读取日志中记录的上次最新时间 $recordedLastTime = Get-Content $lastActivityLog | Get-Date # 确定实际的最新活动时间(如果当前目录有新文件,就更新日志) $actualLastActivityTime = if ($latestFileWriteTime -and $latestFileWriteTime -gt $recordedLastTime) { $latestFileWriteTime | Out-File $lastActivityLog -Encoding utf8 $latestFileWriteTime } else { $recordedLastTime } # 计算时间差 $timeDiff = (Get-Date) - $actualLastActivityTime # 输出监控结果(适配Checkmk格式) if ($timeDiff.TotalHours -ge $alertThresholdHours) { Write-Host $alertMessage exit 2 # Checkmk中exit 2对应CRITICAL状态 } else { Write-Host "$okMessage (最后活动时间: $actualLastActivityTime)" exit 0 # Checkmk中exit 0对应OK状态 }
关键逻辑说明
- 持久化记录:用独立的日志文件
LastCacheActivity.log保存历史最新写入时间,避免因缓存文件被转移/删除导致丢失活动记录 - 双向校验:每次检测时,既对比当前目录内的文件写入时间,也和日志中的历史时间比对,确保不会遗漏任何写入活动
- Checkmk状态适配:通过
exit代码返回状态(0=OK,2=CRITICAL),符合Checkmk的插件规范
Checkmk配置步骤
- 将脚本复制到Windows服务器的Checkmk Agent插件目录(默认路径:
C:\Program Files (x86)\checkmk\agent\plugins) - 确保Checkmk Agent有权限读取监控目录和写入日志文件
- 在Checkmk服务器上,刷新该主机的服务发现,即可识别到自定义监控项
- 配置告警规则,当输出为CRITICAL时触发告警
注意事项
- 日志文件路径不要放在缓存目录内,避免被清理
- 若监控目录包含大量文件,可调整
Get-ChildItem的参数(例如去掉-Recurse)提升检测速度 - 测试时可手动修改日志文件中的时间,验证告警逻辑是否正常触发
内容的提问来源于stack exchange,提问作者Marvin
相关产品推荐
相关产品推荐

