宝塔面板不支持网站到期自动停站,需通过计划任务+Shell脚本实现;推荐在站点根目录创建.expire_at文件标记ISO格式到期日,并用脚本解析时间戳比对执行停站及邮件提醒。

宝塔面板本身不支持“网站到期后自动停止服务”——它只提供手动设置到期时间,且无内置自动停站逻辑。所谓“自动提醒+自动停站”,必须靠计划任务+Shell脚本组合实现。
如何给网站设置一个可被脚本识别的到期时间
宝塔在数据库里存了站点的 end_date 字段,但不对外暴露 API 读取;更可靠的做法是**用文件标记到期时间**,便于 Shell 脚本解析:
- 在站点根目录下新建文件:
/www/wwwroot/example.com/.expire_at - 内容只写一行日期,格式为
2026-05-20(ISO 8601,date -d可直接解析) - 脚本每次执行时用
date -d "$(cat /www/wwwroot/example.com/.expire_at)" +%s转成时间戳,再和当前时间比对 - 别用中文或“2026年5月20日”这类格式,
date -d会解析失败
每天检查到期并自动停站的 Shell 脚本怎么写
把下面这段脚本保存为 /www/scripts/check_site_expiry.sh,然后加可执行权限:chmod +x /www/scripts/check_site_expiry.sh:
#!/bin/bash SITE_DIR="/www/wwwroot/example.com" EXPIRE_FILE="$SITE_DIR/.expire_at" DOMAIN="example.com" <p>if [ ! -f "$EXPIRE_FILE" ]; then exit 0 fi</p><p>EXP_TS=$(date -d "$(cat $EXPIRE_FILE)" +%s 2>/dev/null) NOW_TS=$(date +%s)</p><p>if [ "$EXP_TS" -le "$NOW_TS" ] && [ -n "$EXP_TS" ]; then echo "$(date): Site $DOMAIN expired, stopping..." >> /var/log/site-expiry.log /www/server/panel/pyenv/bin/python /www/server/panel/class/ stopyour_site_name</p><h1>注意:your_site_name 必须替换成你在宝塔里看到的实际站点名(不是域名),比如 example.com</h1><p>fi
- 脚本里调用的是宝塔内部 Python 类的
stop方法,路径和参数不能错,否则静默失败 -
stopyour_site_name中的your_site_name是硬编码的站点标识,不是域名也不是目录名,得去宝塔「网站」列表里看那一列“站点名称”到底填的什么 - 日志写入
/var/log/site-expiry.log,方便排查脚本是否真执行、是否卡在判断逻辑 - 不要用
bt stop example.com—— 宝塔 CLI 的bt命令不支持按域名停站,只认内部 ID 或站点名
怎么配置邮件提醒+停站双动作
单靠停站不够,客户或运营需要提前知道。把停站逻辑和发邮件合并进一个脚本,避免两个任务不同步:
if [ "$EXP_TS" -le "$NOW_TS" ]; then echo "站点 $DOMAIN 已过期,已自动停止" | mail -s "【网站到期】$DOMAIN 停服通知" admin@example.com /www/server/panel/pyenv/bin/python /www/server/panel/class/ stopyour_site_name fi
- 确保系统已配置好
mail命令(如mailx或sendmail),否则邮件发不出,脚本也不会报错 - 别用
echo ... | mutt—— 宝塔默认没装mutt,依赖太多容易断 - 如果要用微信/钉钉,建议在发完邮件后追加
curl调用 Webhook,但注意别让网络超时拖慢整个脚本执行 - 执行周期设为每天一次即可,太频繁没意义,还可能因并发导致重复停站
为什么停站后网站还能访问?三个最常忽略的点
脚本显示“已执行”,但浏览器仍能打开网站,大概率是以下其一:
- 站点名写错了:
stopyour_site_name中的your_site_name和宝塔后台显示的不一致(比如你填了www.example.com,但后台登记的是example.com) - Nginx 没真正 reload:停站只是删了
server块的启用标记,但旧配置可能还在内存里;建议脚本末尾加bt restart nginx强制刷新 - 站点被 Apache 托管但脚本只停了 Nginx:先确认 Web 服务类型,
ps -ef | grep httpd或ps -ef | grep nginx,再对应处理
真正生效的标志只有一个:去宝塔「网站」列表里看那个站点的状态栏,变成灰色“已停止”,且右侧按钮是“启动”而不是“停止”。其他都是假象。

















