用 curl 检测网站 http 状态码是否为 200,需加 -i、-f、-m 10 参数组合,再通过 grep “200 ok” 判断;宝塔计划任务中 mail 发信失败主因是未安装 mail 工具或缺失本地 mta,推荐改用 smtp 工具或 python requests;防误报应采用多周期状态记录+时间窗口统计;python 更适合证书校验、json 接口等复杂场景,须使用宝塔内置 python 及 pip 安装 requests;所有路径、权限、环境变量均需按 www 用户视角配置。

用 curl 检测网站 HTTP 状态码是否为 200
宝塔计划任务本身不内置网站存活逻辑,得靠 shell 脚本判断。最直接的方式是用 curl 发起请求并检查返回状态码,而不是只看连接通不通——很多故障站点仍能响应 502、503 或 404,但业务已不可用。
实操建议:
- 加
-I参数只取响应头,避免下载整个页面,减少超时和资源消耗 - 必须加
-f(--fail),否则curl默认把 4xx/5xx 当作成功,$?仍是 0 - 加
-m 10设定最大耗时,防止 DNS 卡住或后端挂死拖慢整个计划任务队列 - 示例命令:
curl -I -f -m 10 https://example.com/ 2>/dev/null | head -1 | grep "200 OK" >/dev/null
宝塔计划任务里调用 mail 命令发邮件失败的常见原因
多数人写完检测脚本,一加 mail 就收不到信,不是邮箱配置错,而是环境根本没装 mail 或没走本地 MTA。
实操建议:
- 宝塔默认不安装
mailutils(Debian/Ubuntu)或mailx(CentOS),得手动运行apt install mailutils或yum install mailx - 即使装了,
mail命令默认依赖本地sendmail服务,而宝塔面板通常关掉了它;更稳的方式是直接调用 SMTP 工具,比如用ssmtp或改用python -m smtpd脚本发信 - 如果坚持用
mail,务必确认/etc/mail.rc或/etc/ssmtp/ssmtp.conf配置正确,且测试命令如echo test | mail -s "test" your@em.ail在终端能成功执行
脚本里怎么区分“网站宕机”和“临时网络抖动”
单次检测不准,一上来就告警容易误报。得引入重试 + 时间窗口机制,但又不能让脚本卡太久影响计划任务调度。
实操建议:
- 不要在一次任务里循环 sleep 等待,宝塔计划任务是定时触发,应设计成“每次只做一次检测 + 记录时间戳”,靠多次执行积累状态
- 用一个简单文件存最近三次检测结果,比如写入
/www/server/panel/logs/site_health.log,每行格式:$(date +%s) 200或$(date +%s) 0(0 表示失败) - 脚本开头先读该文件,用
awk统计最近 5 分钟内失败次数是否 ≥2,再决定是否发邮件——这样既避免瞬时抖动告警,也不依赖外部数据库 - 注意文件权限:宝塔计划任务以
www用户运行,确保该用户对日志文件有读写权,否则记录失败,状态永远“新鲜”
Python 脚本比 shell 更可靠?什么时候该换
纯 shell 做 HTTPS 证书校验、JSON 接口健康检查、带 Cookie 登录态探测时,会很快撞墙。这时候换 Python 不是“升级”,是补能力缺口。
实操建议:
- 宝塔内置 Python 环境(通常是
/www/server/python/bin/python),不用额外装解释器,但得确认是否装了requests:运行/www/server/python/bin/python -c "import requests"测试 - 如果没装,用
/www/server/python/bin/pip install requests安装,别用系统 pip,路径错会导致计划任务里 import 失败 - Python 脚本里用
requests.get(url, timeout=10, verify=True)自动处理证书验证和重定向,比 curl -k 安全得多;错误分支也能细判r.status_code、r.reason、r.raise_for_status() - 别在 Python 脚本里硬编码邮箱密码——用宝塔计划任务的“脚本参数”功能传入加密后的 SMTP 密钥,或读取
/www/server/panel/vhost/ssl/下已有的配置文件(需注意权限)
www 用户视角重新验证,这点最容易被忽略。










