【linux】遇到服务(如网站)不可用时,排查思路?

当我们发现自己网站,用浏览器不能访问的时候,我们需要一步步排查问题。

整个部署的链路是 Nginx -> uWSGI -> Python Web程序

下面以分析 python 程序为例!

第一步:进程分析

  1. 查看进程信息
python 复制代码
 sudo ps aux | grep python
 或者
 sudo ps -ef | grep python 

返回结果为

python 复制代码
USER     PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
tu      4491  0.0 18.0 3489820 2960628 ?     Sl   Jan29   0:19 python a.py
tu     12602  5.3 26.4 4910444 4343708 pts/1 Sl+  12:34   4:07 python b.py

# 输出结果中 USER 后面的 PID 代表进程编号。

进入 /proc/PID/ 目录的文件信息来得到这个进程的一些信息

(Linux中一切皆文件,进程信息也在文件中),

比如它是在哪个目录启动的,启动命令是什么等信息。执行命令后输入内容如下:

python 复制代码
# 进入相关PID目录
sudo cd /proc/4491 

# 查看在哪个目录启动的,启动命令是什么等信息  
sudo ls -ahl         

lrwxrwxrwx   1 tu tu 0 Feb 17 13:32 cwd -> /home/tu  # 启动进程时的工作目录
-r--------   1 tu tu 0 Feb 17 13:32 environ          # 进程的环境变量列表
lrwxrwxrwx   1 tu tu 0 Feb 17 12:00 exe -> /usr/bin/python2.7  # 链接到进程的执行命令文件
  1. 向进程发送信号
python 复制代码
# 杀死指定pid进程
sudo kill PID 

# 强制杀死一个进程       
sudo kill -9 PID 

# 强制杀死uwsgi这个进程    
sudo kill -9 uwsgi   
  1. 查看进程打开了哪些文件
    如果是分析一个你不太了解的进程,这个命令比较有用:lsof -p PID
python 复制代码
# 查看进程中的 TCP 连接信息
sudo lsof -p PID | grep TCP    
  1. 查看文件被哪个进程使用
    使用这个命令查看一个文件被哪些进程正在使用 :sudo lsof /path/to/file
python 复制代码
> sudo lsof /home/tu/.virtualenvs/mic/bin/uwsgi

COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF     NODE NAME
uwsgi    2071 tu txt    REG 253,17  1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
uwsgi   13286 tu txt    REG 253,17  1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
uwsgi   13287 tu txt    REG 253,17  1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
uwsgi   13288 tu txt    REG 253,17  1270899 13240576 /home/tu/.virtualenvs/mic/bin/uwsgi
  1. 查看进程当前状态
    当我们发现一个进程启动了,端口也是正常的,但好像这个进程就是不"干活"。比如我们执行的是数据更新进程,这个进程不更新数据了,但还是在跑着。
    可能数据源有问题,可能我们写的程序有BUG,也可能是更新时要写入到的数据库出问题了(数据库连接不上了,写数据死锁了)。
    我们这里主要说下第二种,我们自己的程序如果有BUG,导致工作不正常,我们怎么知道它当前正在干什么呢,这时候就要用到Linux中的调试分析诊断strace,可以使用这个命令:
python 复制代码
sudo strace -p PID

第二步:端口分析

  1. 查看全部端口占用情况
    使用 netstat 工具来进程网络分析,netstat 命令有非常多选项,这里只列出了常用的一部分
    -a或--all 显示所有连接中的Socket,默认不显示 LISTEN 相关的。
    -c或--continuous 持续列出网络状态,不断自动刷新输出。
    -l或--listening 显示监听中的服务器的Socket。
    -n或--numeric 直接使用IP地址,而不是展示域名。
    -p或--programs 显示正在使用Socket的程序进程PID和名称。
    -t或--tcp 显示TCP传输协议的连接。
    -u或--udp 显示UDP传输协议的连接。
    比如我们可以查看服务器中监控了哪些端口,如果我们的nginx是使用80端口,uwsgi使用的是7001端口,我们就能知道通过下面的命令
python 复制代码
> sudo netstat -nltp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:7001            0.0.0.0:*               LISTEN      2070/uwsgi      
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1575/redis-server 1

# 就能知道80端口的 nginx 是不是启动成功了,7001端口的uwsgi是不是启动成功了。
# 注意:如果PID和Program Name显示不出来,证明是权限不够,可以使用sudo运行
  1. 查看具体端口占用情况
python 复制代码
sudo lsof -i:80
# 端口80前面有个英文的冒号

COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   4123   admin    3u  IPv4  13031      0t0  TCP *:http (LISTEN)
nginx   4124   admin    3u  IPv4  13031      0t0  TCP *:http (LISTEN)
# 我们可以通过这个方法查询出占用端口的程序,如果遇到端口已经被占用,原来的进程没有正确地终止,可以使
# 用kill命令停掉原来的进程,这样我们就又可以使用这个端口了。
相关推荐
车载诊断技术12 分钟前
电子电气架构 --- 什么是EPS?
网络·人工智能·安全·架构·汽车·需求分析
KevinRay_16 分钟前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
2301_819287121 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la1 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
武汉联从信息1 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
天天进步20151 小时前
STUN服务器实现NAT穿透
运维·服务器
月如琉璃2 小时前
1.gitlab 服务器搭建流程
服务器·gitlab
Black_mario2 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
Kika写代码2 小时前
【微信小程序】页面跳转基础 | 我的咖啡店-综合实训
服务器·微信小程序·小程序
Aileen_0v02 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper