文章目录

前言

本文记录一套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:文件数量多、网络波动大,打包压缩上传

  1. 本地打包代码
tar -zcvf code_update.tar.gz .
  1. 上传压缩包到服务器家目录
scp code_update.tar.gz 用户名@服务器公网IP:/home/xxx/
  1. 服务器端解压覆盖项目目录
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后台托管服务

  1. 创建服务配置文件
sudo vim /etc/systemd/system/monitor-scheduler.service
  1. 写入通用服务配置
[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
  1. 加载服务、设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable monitor-scheduler
sudo systemctl start monitor-scheduler
# 查看运行状态
systemctl status monitor-scheduler

二、业务场景:本地代码迭代,更新线上新版本

2.1 本地电脑上传新版代码至服务器

同上文中上传方案,任选其一覆盖更新代码

2.2 服务器标准更新重启全流程

  1. 切换到项目根目录
cd /home/xxx/monitor_project
  1. 停止当前正在后台运行的监控服务
sudo systemctl stop monitor-scheduler
  1. 重载systemd配置(修改service文件必须执行;仅更新业务代码建议带上,规范操作)
sudo systemctl daemon-reload
  1. 启动加载新版代码的监控服务
sudo systemctl start monitor-scheduler
  1. 实时打印服务运行日志,确认新版本正常加载
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 标准正确操作:先激活虚拟环境再执行脚本

  1. 激活项目虚拟环境
source venv/bin/activate

终端前缀出现(venv)字样即代表激活成功
2. 单次执行检测脚本,验证接口请求、状态码校验逻辑

python3 tab_monitor.py
  1. 测试完成后退出虚拟环境
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 配套网络辅助排查工具

  1. 查看系统网卡信息
ip addr
  1. 检索后台VPN/拨号进程(网络频繁抖动常见根源)
ps aux | grep pppd
  1. 探测域名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)

八、全程实操踩坑总结

  1. 登录服务器后先测试网络,外网不通会导致上传代码、接口巡检全部失败;
  2. 直接使用系统全局python运行脚本,必报oss2等依赖缺失,必须先激活项目venv虚拟环境;
  3. FEISHU_WEBHOOK_URL= 空赋值无法关闭告警,会触发无效接口请求报错,清除变量unset才是调试标准写法;
  4. 调度JSON文件自带当日日期,内部仅存储今日任务,无需复杂jq筛选,grep检索日期字符串最简单高效;
  5. 监控频繁请求超时、告警失败优先排查网络:ping公网 → ping业务域名 → ping告警域名 → 检查后台VPN/代理进程;
  6. 本地更新代码上传服务器后,必须重启systemd服务,后台进程才会加载新版代码;
  7. 网络抖动、SSH断线优先检索pppd拨号进程,VPN自动重连会篡改系统路由,是线上服务不稳定高频诱因;
  8. 初次部署忘记配置systemd自启,服务器重启后程序不会自动恢复运行。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐