【服务部署】Python 定时监控服务部署实操
文章目录
前言
本文记录一套Python定时监控服务完整实操流程,覆盖服务器远程登录、项目初次部署、本地代码更新上传、服务重启、调度计划查看、本地单测报错解决、告警环境变量调试、ping网络连通排查,全程无内网IP、真实业务地址,命令通用,适合使用systemd托管Python后台定时服务的开发、运维人员参考。
项目简介
基于Python开发的接口定时巡检程序,定时请求业务接口校验返回状态码,异常自动通过机器人推送告警;项目采用独立venv虚拟环境隔离依赖,通过systemd实现开机自启、7×24小时稳定后台运行。
零、前置操作:远程登录Linux服务器
本地终端通过SSH连接服务器,是所有线上操作的第一步
0.1 SSH登录通用命令
ssh 服务器用户名@服务器公网IP
输入服务器登录密码即可进入服务器终端;
若配置密钥免密登录,直接执行上述命令无需重复输密码。
0.2 登录后基础环境校验(初次部署必做)
登录成功后,先确认系统网络、基础工具是否齐全
# 测试外网连通
ping www.baidu.com -c 10
# 查看系统版本
cat /etc/os-release
# 查看当前所在目录
pwd
一、初次部署:从零搭建项目运行环境
1.1 安装系统基础依赖工具
# Ubuntu/Debian系统
sudo apt update
sudo apt install python3 python3-pip python3-venv jq netcat
1.2 创建项目存放目录
# 创建项目文件夹
mkdir -p /home/xxx/monitor_project
# 进入项目目录
cd /home/xxx/monitor_project
1.3 本地上传完整源码至服务器
两种上传方案,按需选用
方案1:少量文件直接覆盖上传(日常迭代首选)
本地终端进入代码根目录执行:
scp -r . 用户名@服务器公网IP:/home/xxx/monitor_project/
方案2:文件数量多、网络波动大,打包压缩上传
- 本地打包代码
tar -zcvf code_update.tar.gz .
- 上传压缩包到服务器家目录
scp code_update.tar.gz 用户名@服务器公网IP:/home/xxx/
- 服务器端解压覆盖项目目录
cd /home/xxx/monitor_project
tar -zxvf ../code_update.tar.gz
1.4 初始化虚拟环境、安装项目依赖
# 在项目目录创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 安装全部第三方依赖
pip install -r requirements.txt
# 退出虚拟环境
deactivate
1.5 配置systemd后台托管服务
- 创建服务配置文件
sudo vim /etc/systemd/system/monitor-scheduler.service
- 写入通用服务配置
[Unit]
Description=Python Monitor Scheduler Service
After=network.target
[Service]
User=xxx
WorkingDirectory=/home/xxx/monitor_project
ExecStart=/home/xxx/monitor_project/venv/bin/python3 monitor_scheduler.py
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
- 加载服务、设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable monitor-scheduler
sudo systemctl start monitor-scheduler
# 查看运行状态
systemctl status monitor-scheduler
二、业务场景:本地代码迭代,更新线上新版本
2.1 本地电脑上传新版代码至服务器
同上文中上传方案,任选其一覆盖更新代码
2.2 服务器标准更新重启全流程
- 切换到项目根目录
cd /home/xxx/monitor_project
- 停止当前正在后台运行的监控服务
sudo systemctl stop monitor-scheduler
- 重载systemd配置(修改service文件必须执行;仅更新业务代码建议带上,规范操作)
sudo systemctl daemon-reload
- 启动加载新版代码的监控服务
sudo systemctl start monitor-scheduler
- 实时打印服务运行日志,确认新版本正常加载
journalctl -u monitor-scheduler -f
日志现象说明
重启成功后日志会打印全新调度计划文件路径,同时刷新下一轮任务执行时间,代表新代码生效。
示例日志展示:
07月 03 09:31:19 xxx python3[8781]: [2026-07-03 09:31:19] 调度器已启动:累计执行22631次,月度跳过303次,下次执行 2026-07-03 11:43:00,计划文件 /home/xxx/monitor_project/logs/schedule_plan_20260703_093119.json
三、查看今日定时任务执行时间(仅过滤当天任务)
3.1 列出当天自动生成的所有调度JSON文件
文件命名规则 schedule_plan_年月日_时分秒.json,文件名自带日期,文件内仅存储当日任务,不存在跨天数据
ls logs/schedule_plan_20260703*.json
输出示例:
logs/schedule_plan_20260703_084753.json logs/schedule_plan_20260703_093119.json
logs/schedule_plan_20260703_085923.json logs/schedule_plan_20260703_093911.json
logs/schedule_plan_20260703_091255.json
末尾时间戳最新的文件 schedule_plan_20260703_093911.json 是当前程序正在使用的生效计划表。
3.2 两种方式查看文件内全部执行时间
方式1:grep 快速提取所有当日时间(无工具依赖,最简单)
cat logs/schedule_plan_20260703_093911.json | grep "2026-07-03"
方式2:jq工具格式化完整阅读计划
已在部署阶段安装jq,直接执行格式化命令
cat logs/schedule_plan_20260703_093911.json | jq .
踩坑记录:错误筛选命令及报错
最初尝试使用jq数组筛选语法,因JSON根节点不是数组直接报错,不推荐使用:
# 错误命令
cat logs/schedule_plan_20260703_093911.json | jq 'map(select(.exec_time | startswith("2026-07-03")))'
# 报错提示
jq: error (at <stdin>:22633): Cannot index string with string "exec_time"
解决方案:放弃复杂jq筛选,直接grep检索日期字符串即可。
四、前台单次运行脚本验证新版代码(完整踩坑流程)
4.1 直接使用系统python执行,出现第三方依赖缺失报错
执行命令:
python3 tab_monitor.py
报错内容:
Traceback (most recent call last):
File "/home/xxx/monitor_project/tab_monitor.py", line 74, in <module>
from monitor_oss import upload_html_to_oss
File "/home/xxx/monitor_project/monitor_oss.py", line 6, in <module>
import oss2
ModuleNotFoundError: No module named 'oss2'
报错根因
项目所有第三方依赖(oss2、requests等)均安装在项目专属虚拟环境venv内,系统全局Python环境未安装对应包,直接运行会缺失依赖。
4.2 标准正确操作:先激活虚拟环境再执行脚本
- 激活项目虚拟环境
source venv/bin/activate
终端前缀出现(venv)字样即代表激活成功
2. 单次执行检测脚本,验证接口请求、状态码校验逻辑
python3 tab_monitor.py
- 测试完成后退出虚拟环境
deactivate
4.3 激活虚拟环境后仍报依赖缺失的修复方案
source venv/bin/activate
pip install -r requirements.txt
deactivate
五、调试场景:环境变量控制告警推送开关(避坑重点)
需求:本地调试脚本,避免频繁推送消息至告警测试群
5.1 错误写法(禁止使用)
FEISHU_WEBHOOK_URL= python3 tab_monitor.py
问题说明:该写法仅将环境变量赋值为空字符串,脚本读取空地址后会直接请求告警接口抛出异常,无法静默跳过告警逻辑。
5.2 方案1:传入合法Webhook地址,完整测试告警推送
source venv/bin/activate
FEISHU_WEBHOOK_URL="https://open.feishu.cn/xxx_test_hook" python3 tab_monitor.py
5.3 方案2:彻底关闭告警推送(调试专用,推荐)
清除环境变量,脚本内部判断变量不存在时自动跳过推送逻辑,无报错、无无效请求
source venv/bin/activate
unset FEISHU_WEBHOOK_URL && python3 tab_monitor.py
补充说明
终端临时设置的环境变量仅前台单次脚本生效;后台systemd常驻服务不会读取终端临时变量。如需永久修改告警地址,需要修改项目配置文件或.service服务配置文件。
六、网络连通性全套ping排查命令(接口超时、推送失败专用)
监控服务强依赖网络访问业务接口与告警域名,出现请求超时、推送失败时,按以下顺序排查链路,全部为通用命令
6.1 基础公网连通测试
判断服务器是否能正常访问外网
ping www.baidu.com
6.2 长ping持续测试网络稳定性,统计丢包率
发送100个数据包,结束自动输出延迟、丢包数据,排查网络抖动
ping www.baidu.com -c 100
6.3 告警平台域名专项连通测试
无法ping通则代表服务器访问告警平台链路异常,所有告警推送全部失效
ping open.feishu.cn
6.4 业务接口域名连通测试
替换为自身业务接口域名,ping不通则监控全部请求异常
ping api.business-domain.com
6.5 配套网络辅助排查工具
- 查看系统网卡信息
ip addr
- 检索后台VPN/拨号进程(网络频繁抖动常见根源)
ps aux | grep pppd
- 探测域名443端口连通性(域名能ping通但HTTPS请求失败时使用)
# 安装端口探测工具
sudo apt install netcat
# 探测443端口
nc -zv api.business-domain.com 443
七、运维常用命令汇总(登录/部署/服务/虚拟环境/网络全覆盖)
7.1 服务器远程登录
ssh 用户名@服务器公网IP
7.2 项目初次部署相关
# 安装系统工具
sudo apt install python3-venv jq netcat
# 创建项目目录
mkdir -p /home/xxx/monitor_project
# 初始化虚拟环境
python3 -m venv venv
# 加载systemd服务配置
sudo systemctl daemon-reload
# 设置开机自启
sudo systemctl enable monitor-scheduler
7.3 服务启停、日志查看
# 实时滚动查看监控服务日志
journalctl -u monitor-scheduler -f
# 查看今日全部历史运行日志
journalctl -u monitor-scheduler --since "today"
# 查看服务运行状态、启动失败原因
systemctl status monitor-scheduler
# 停止/重启监控服务
sudo systemctl stop monitor-scheduler
sudo systemctl restart monitor-scheduler
# 重载systemd配置文件
sudo systemctl daemon-reload
7.4 查看当日定时调度计划
# 列出今日所有调度文件
ls logs/schedule_plan_20260703*.json
# 提取文件内全部当日执行时间
cat logs/schedule_plan_20260703_093911.json | grep "2026-07-03"
# jq格式化完整查看任务
cat logs/schedule_plan_20260703_093911.json | jq .
7.5 虚拟环境、单测脚本操作
# 激活虚拟环境
source venv/bin/activate
# 单次运行检测脚本
python3 tab_monitor.py
# 退出虚拟环境
deactivate
# 一键安装全部项目依赖
pip install -r requirements.txt
7.6 告警环境变量调试
# 正常推送告警消息
FEISHU_WEBHOOK_URL="https://open.feishu.cn/xxx" python3 tab_monitor.py
# 调试关闭告警,无推送无报错
unset FEISHU_WEBHOOK_URL && python3 tab_monitor.py
7.7 Ping网络故障排查全套
# 外网连通检测
ping www.baidu.com
# 告警域名连通检测
ping open.feishu.cn
# 100包长ping测网络丢包
ping www.baidu.com -c 100
# 业务接口域名连通检测
ping api.business-domain.com
# HTTPS端口连通探测
nc -zv api.business-domain.com 443
7.8 代码更新前备份项目(防止覆盖丢失)
cp -r /home/xxx/monitor_project /home/xxx/monitor_project_bak_$(date +%Y%m%d)
八、全程实操踩坑总结
- 登录服务器后先测试网络,外网不通会导致上传代码、接口巡检全部失败;
- 直接使用系统全局python运行脚本,必报oss2等依赖缺失,必须先激活项目venv虚拟环境;
FEISHU_WEBHOOK_URL=空赋值无法关闭告警,会触发无效接口请求报错,清除变量unset才是调试标准写法;- 调度JSON文件自带当日日期,内部仅存储今日任务,无需复杂jq筛选,grep检索日期字符串最简单高效;
- 监控频繁请求超时、告警失败优先排查网络:ping公网 → ping业务域名 → ping告警域名 → 检查后台VPN/代理进程;
- 本地更新代码上传服务器后,必须重启systemd服务,后台进程才会加载新版代码;
- 网络抖动、SSH断线优先检索pppd拨号进程,VPN自动重连会篡改系统路由,是线上服务不稳定高频诱因;
- 初次部署忘记配置systemd自启,服务器重启后程序不会自动恢复运行。
更多推荐



所有评论(0)