问题与目标
“接口打不开”可能是进程未启动、端口未监听、服务反复退出或任务根本没有执行。本篇建立从进程到端口、日志、服务和定时任务的基础排查链。
完成标准:能启动一个本地服务,找到它的 PID 和监听端口,读取日志,正常停止进程,并理解 systemd 与 cron 各自负责什么。
核心概念
进程是正在运行的程序,PID 是进程编号;端口是网络服务在主机上的入口;日志记录运行事实。systemd 负责长期服务的启动、停止和重启,cron 负责按时间触发短任务。两者都不代替应用自身的错误处理。
排查顺序通常是:服务状态 → 进程 → 监听端口 → 本机请求 → 日志。停止进程先发送默认的 SIGTERM,给程序清理资源的机会;只有无法正常退出时才考虑 SIGKILL。
ps aux 适合观察用户、CPU、内存和状态,ps -ef 更容易观察 PID、PPID 与启动命令。top 看持续变化,free -h 看内存,df -h 看文件系统容量。这些指标要结合时间和业务负载判断,单次快照不能直接证明根因。
可运行实现
在一个终端启动服务并记录日志:
mkdir -p ~/service-demo
cd ~/service-demo
python3 -m http.server 8000 >server.log 2>&1 &
echo $! > server.pid
在另一个终端检查:
ps -fp "$(cat ~/service-demo/server.pid)"
ss -lntp | grep ':8000'
curl -I http://127.0.0.1:8000
tail -f ~/service-demo/server.log
停止服务:
kill "$(cat ~/service-demo/server.pid)"
长期服务可交给 systemd。下面是结构示例,实际保存到 /etc/systemd/system/demo.service 前要把用户和路径替换为真实值:
[Unit]
Description=Demo HTTP service
After=network.target
[Service]
User=dev
WorkingDirectory=/home/dev/service-demo
ExecStart=/usr/bin/python3 -m http.server 8000
Restart=on-failure
[Install]
WantedBy=multi-user.target
加载后使用 systemctl status demo 查看状态,用 journalctl -u demo -n 100 --no-pager 查看日志。
完整加载与启停流程是:
sudo systemctl daemon-reload
sudo systemctl enable --now demo.service
systemctl status demo.service --no-pager
journalctl -u demo.service -f
sudo systemctl restart demo.service
sudo systemctl stop demo.service
修改 unit 文件后必须再次 daemon-reload。enable 设置开机启动,start 只影响当前运行状态,两者不是同一件事。
cron 任务必须使用绝对路径,例如每天 02:30 执行:
30 2 * * * /home/dev/app/.venv/bin/python /home/dev/app/cleanup.py >> /home/dev/app/cleanup.log 2>&1
五个时间字段依次是“分钟、小时、日、月、星期”。先用每分钟任务验证路径,确认成功后再改为正式时间:
* * * * * /usr/bin/date >> /home/dev/cron-check.log 2>&1
常见问题与排查
- 有进程但没端口:程序可能尚未启动完成、监听了别的端口,或已卡在初始化。
- 负载高但原因不明:先用
top判断是 CPU、内存还是 I/O 等待,再用ps定位进程,不要直接按进程名批量终止。 - 端口被占用:
ss -lntp找到 PID 后核对启动命令和所属用户,避免停止无关服务。 - 本机可访问、外部不可访问:检查监听地址、防火墙和云安全组。
127.0.0.1只接受本机连接。 - systemd 手动运行成功但服务失败:检查
User、WorkingDirectory、绝对路径和环境变量。 - cron 不执行:cron 环境很精简,不能依赖交互式 Shell 的 PATH;命令和重定向都用绝对路径。
- 日志无限增长:应使用日志轮转,不能长期把所有输出写入单个文件。
小结
进程、端口和日志是同一运行事实的不同视角。按固定链路逐层验证,比反复重启更容易定位根因。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


