欢迎光临
我们一直在努力

定时任务挂了没人知道?一行心跳,让脚本自己“报平安”

一、但凡跑过定时任务,都懂这种痛

备份脚本没跑,数据丢了几天才发现。清理脚本停了,表膨胀到查询变慢。数据同步断了,两边对不上,排查了一下午。

不管是 Shell、Python、批处理,还是 SQL 脚本,只要是靠定时任务跑的,都逃不过一个问题:没人盯着,挂了很难第一时间知道。

拿我自己举个例。我用的是 SQL Server Express,微软官方免费版,日常够用。但它有个硬伤:没有 SQL Agent。

SQL Agent 是 SQL Server 自带的定时任务调度器,Standard 及以上版本才有。没有它,就不能直接在数据库里创建定时任务。最开始我每天手动执行 SQL 脚本,做了一周就烦了。后来某天忘了跑,正好赶上数据没清理,表膨胀到几十万行,查询明显变慢。

那之后我搞了一套方案:Windows 计划任务 + sqlcmd 命令行 + 一行心跳打卡。跑了两个月,稳得很。

但这不是重点。 无论你用的是 MySQL、PostgreSQL,还是跑一个 Python 数据处理脚本,思路完全一样。所有脚本,都值得在最后一行加上心跳。


二、我的真实需求

我的项目里有一张日志表,每天产生大量记录。为了不影响查询性能,需要定期删除历史旧数据。

核心命令是这样的:

batch

"C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\180\\Tools\\Binn\\SQLCMD.EXE" -S . -U sa -P 你的密码 -d MyProjectDb -i C:\\sqlscript\\DailyCleanup.sql -b -o C:\\Logs\\DailyCleanup.log -C

这个命令做了什么:

参数含义
-S . 连接本地默认实例
-U sa 数据库管理员账号
-P 密码
-d MyProjectDb 目标数据库
-i DailyCleanup.sql 要执行的清理脚本
-b 脚本出错就立即退出
-o DailyCleanup.log 执行日志输出到文件
-C 信任服务器证书

每次手动打开命令行执行,既麻烦又容易忘。


三、用 Windows 计划任务自动执行

思路很简单:把这个命令放进一个 .bat 批处理文件,让 Windows 计划任务每天凌晨自动跑。

1. 创建批处理文件

新建 DailyCleanup.bat:

batch

@echo off

REM 执行 SQL 清理脚本
"C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\180\\Tools\\Binn\\SQLCMD.EXE" -S . -U sa -P 你的密码 -d MyProjectDb -i C:\\sqlscript\\DailyCleanup.sql -b -o C:\\Logs\\DailyCleanup.log -C

REM 写入执行记录
echo %date% %time%: 清理任务已完成 >> C:\\Logs\\CleanupTask.log

2. 配置 Windows 计划任务

配好之后,每天凌晨 2 点系统会自动执行。第二天看 C:\\Logs\\CleanupTask.log,最新的执行记录已经在那儿了。


四、方案已经可用,但还可以更完美

到这里,定时执行的问题已经解决了。计划任务每天凌晨自动跑,日志文件里能看到执行记录,数据清理正常进行。

用了大概一个月,一切正常。直到有次查询明显变慢,我才想起来——好像很久没关心过那个清理脚本了。

打开日志一看,脚本因为数据库连接超时,已经静默失败了好几天。那几天表没清理,数据量积压,查询自然慢了。而我一次都没打开过日志文件。

方案是可行的,但缺少一个“主动告诉我”的环节。 我不需要每天检查日志,我只需要在任务没跑的时候被通知。

这时候就想到了心跳监控。


五、加上心跳,让任务自己“报平安”

心跳监控的原理很简单:你的任务跑完时,主动向监控平台发一个信号。平台只负责等——超过约定时间没收到信号,就触发告警。

这比每天检查日志方便得多:

方式你需要做什么
检查日志 每天打开文件看
心跳监控 正常运行不打扰,挂了自动通知

不管你是 Shell、Python、批处理还是 SQL 脚本,最后一行都值得加上心跳。


1. 获取心跳 URL

登录云哨兵,点击右上角昵称,如果还没启用,进入心跳管理页面进行设置。

完整的打卡地址是:

text

https://www.cloudssp.cn/api/ping/你的心跳编码


2. 在脚本最后一行加上心跳

Windows 批处理(我的方案):

batch

@echo off

REM 执行 SQL 清理脚本
"C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\180\\Tools\\Binn\\SQLCMD.EXE" -S . -U sa -P 你的密码 -d MyProjectDb -i C:\\sqlscript\\DailyCleanup.sql -b -o C:\\Logs\\DailyCleanup.log -C

REM 写入执行记录
echo %date% %time%: 清理任务已完成 >> C:\\Logs\\CleanupTask.log

REM 最后一行:发送心跳打卡
curl -X POST "https://www.cloudssp.cn/api/ping/你的心跳编码"

Windows 无 curl 时用 PowerShell:

batch

powershell -Command "Invoke-WebRequest -Uri 'https://www.cloudssp.cn/api/ping/你的心跳编码' -Method POST"

Linux Shell 脚本:

bash

#!/bin/bash
# 你的备份/清理逻辑
# …
# 最后一行:
curl -X POST "https://www.cloudssp.cn/api/ping/你的心跳编码"

Python 脚本:

python

import requests
# 你的业务逻辑
# …
# 最后一行:
requests.post("https://www.cloudssp.cn/api/ping/你的心跳编码")


3. 效果

从“每天检查日志”变成了“挂了才通知你”。 不打扰,但关键时刻不会缺席。


六、这套方案的优点

维度说明
轻量 一个脚本 + 一个计划任务 + 一行心跳,没有额外依赖
通用 Shell、Python、批处理、SQL,什么脚本都能用
可靠 计划任务/cron 本身稳定,心跳作为第二层保障
不打扰 正常运行时不发任何通知
不漏报 任务挂了自动告警

七、写在最后

不管是 SQL Express 没有 Agent,还是 Linux 上靠 cron 跑脚本,定时任务都有一个共同的问题:挂了没人知道。

一个脚本 + 一个计划任务 + 一行心跳打卡,就实现了从“手动执行”到“自动执行 + 异常告警”的转变。

思路不复杂,但确实能省掉很多不必要的担心。如果你也在跑定时任务,不妨试一下。

赞(0)
未经允许不得转载:171主机测评 » 定时任务挂了没人知道?一行心跳,让脚本自己“报平安”
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址