Windows 10持续运行场景下挂机/BSOD远程邮件告警方案实现求助
这个心跳监控方案完全可行,而且实现起来非常轻量,刚好匹配你的需求——我来一步步给你拆解实现细节、代码参考和部署注意事项:
一、方案可行性分析
这个思路逻辑清晰,依赖的技术都是成熟且易实现的:
- 本地用Windows自带的工具(curl/任务计划)就能完成心跳发送,不需要额外安装软件
- 远程PHP服务只需要做简单的文件存储和定时检查,甚至不需要数据库(用文件或轻量SQLite即可)
- 邮件通知是PHP的基础功能,配置门槛低
- 整个流程几乎没有单点故障,即使本地脚本偶尔失败,服务器的超时检查也能及时发现
二、本地Windows端BAT心跳脚本
推荐用Windows任务计划程序定时运行脚本(比bat自身循环更可靠,避免脚本崩溃后停止工作),脚本内容如下:
@echo off :: 获取当前PC的名称,作为唯一标识(方便区分多台设备) set "PC_ID=%COMPUTERNAME%" :: 替换成你的远程PHP服务地址 set "HEARTBEAT_URL=http://你的服务器域名/heartbeat.php?pc=%PC_ID%" :: 发送心跳请求,-s静默模式,-o nul忽略输出 curl -s -o nul "%HEARTBEAT_URL%" :: 可选:如果curl命令报错(比如没有curl),可以用PowerShell替代 :: powershell -Command "(Invoke-WebRequest -Uri '%HEARTBEAT_URL%' -UseBasicParsing).StatusCode"
任务计划设置步骤:
- 打开「任务计划程序」→ 创建基本任务
- 触发器选择「每天」,然后设置重复间隔为10分钟,持续时间为「无限期」
- 操作选择「启动程序」,浏览选择你的bat脚本
- 勾选「不管用户是否登录都要运行」,并设置最高权限(避免网络访问权限问题)
三、远程PHP服务端实现
分为两个核心脚本:心跳接收接口、超时检查+邮件通知脚本
1. 心跳接收接口(heartbeat.php)
负责记录每台PC的最后心跳时间,用文件存储足够轻量:
<?php // 存储心跳数据的目录,确保服务器有写入权限 $storageDir = __DIR__ . '/heartbeat_storage/'; if (!is_dir($storageDir)) { mkdir($storageDir, 0755, true); } // 获取PC标识:优先用URL参数里的PC名称, fallback到客户端IP $pcId = $_GET['pc'] ?? $_SERVER['REMOTE_ADDR']; $currentTimestamp = time(); // 写入心跳时间到文件 file_put_contents($storageDir . $pcId . '.txt', $currentTimestamp); // 返回成功响应 http_response_code(200); echo "Heartbeat received successfully"; ?>
2. 超时检查&邮件通知脚本(check_heartbeat.php)
定时检查所有PC的心跳时间,超过阈值就发送邮件:
<?php // 超时阈值:10分钟心跳间隔 + 2分钟缓冲(避免网络延迟误报)= 12分钟 $timeoutThreshold = 12 * 60; $storageDir = __DIR__ . '/heartbeat_storage/'; $notificationEmail = '你的接收邮箱@xxx.com'; $emailSubject = 'PC心跳异常告警'; // 遍历所有心跳文件 foreach (glob($storageDir . '*.txt') as $file) { $pcId = basename($file, '.txt'); $lastHeartbeat = (int)file_get_contents($file); // 判断是否超时 if (time() - $lastHeartbeat > $timeoutThreshold) { $emailContent = "⚠️ 告警通知:\nPC {$pcId} 已超过 " . ($timeoutThreshold/60) . " 分钟未发送心跳,可能出现hang/freeze/BSOD情况,请及时检查设备状态。"; // 发送邮件(如果默认mail()函数不好用,推荐用PHPMailer库走SMTP,更稳定) mail($notificationEmail, $emailSubject, $emailContent); // 重命名文件避免重复发送告警 rename($file, $file . '_alerted'); } } ?>
邮件功能优化建议
如果服务器默认的mail()函数无法正常发送邮件,推荐使用PHPMailer库(开源免费),通过SMTP协议发送(比如用QQ邮箱、163邮箱的SMTP服务),配置更稳定,不容易被当成垃圾邮件。
四、服务器持续监听的设置方法
需要让check_heartbeat.php定时自动运行,不同系统配置方式不同:
Linux服务器(推荐)
用crontab定时任务,每5分钟运行一次检查脚本:
- 登录服务器,执行
crontab -e编辑定时任务 - 添加一行:
(替换成你的PHP路径和脚本实际路径)*/5 * * * * /usr/bin/php /var/www/html/check_heartbeat.php - 保存退出即可,crontab会自动生效
Windows服务器
用「任务计划程序」设置定时任务:
- 创建基本任务,触发器选择「每天」,重复间隔5分钟,持续无限期
- 操作选择「启动程序」,程序路径填你的PHP.exe路径(比如
C:\php\php.exe),添加参数为你的脚本路径(比如"C:\inetpub\wwwroot\check_heartbeat.php") - 勾选最高权限运行
五、服务器负载影响评估
这个方案的负载极低,完全不用担心:
- 每个心跳请求是简单的GET请求,服务器只做一次文件写入操作,CPU/内存占用可以忽略
- 检查脚本每次只遍历少量文件(即使有几十台PC),执行时间毫秒级
- 带宽消耗极小:每个心跳请求的大小不到1KB,每天每台PC仅产生约7MB流量
额外注意事项
- 给
heartbeat_storage目录设置合适的权限:确保PHP进程有写入权限,但不要给全局可写权限(避免安全风险) - 可以给心跳接口加简单的身份验证(比如URL里加一个密钥参数
&key=你的密钥,脚本里验证),防止恶意请求 - 测试阶段可以把超时阈值设短一点(比如2分钟),验证整个流程是否正常工作
内容的提问来源于stack exchange,提问作者Mithun




