Linux 服务器问题排查:端口、进程、日志常用命令速查
服务挂了、端口被占、日志不知道在哪,这类问题在 SSH 上服务器后最常见。这篇是个人的命令速查手册,每个命令都附上实际场景的用法,不只是参数列表。
端口排查:ss / lsof
ss(socket statistics)是查看网络连接状态的工具,是老版 netstat 的替代品,现代 Linux 发行版默认自带。lsof(list open files)做的事不同——Linux 里一切皆文件,网络连接也算,所以 lsof 可以列出哪个进程打开了哪些文件和网络连接。
查端口占用时两个都能用:ss 速度更快,专注网络;lsof 信息更全(用户、文件描述符),但稍慢。
查看哪个进程在监听某个端口
1 | # 查看 8080 端口被哪个进程占用 |
ss 输出示例:
1 | LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=12345,fd=42)) |
lsof 输出示例:
1 | COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
两个命令拿到的 PID 一样,lsof 显示的信息更多(用户、文件描述符)。
查看所有监听端口
1 | ss -tlnp |
输出:
1 | State Recv-Q Send-Q Local Address:Port Peer Address:Port Process |
查看所有已建立的连接
1 | # 看有多少客户端连到了 80 端口 |
netstat(老系统备用)
部分旧服务器没有 ss,用 netstat:
1 | netstat -tlnp # 查监听端口(需要 net-tools 包) |
进程排查:ps / top
ps(process status)拍一张进程快照,输出当前时刻所有进程的状态,适合搜索特定进程、接管道做过滤。top 是实时监控,每隔几秒刷新一次,适合看某个进程是否在持续吃 CPU 或内存,或者整体资源占用是否异常。
两者互补:想找”java 进程 PID 是多少”用 ps;想看”谁在疯狂吃 CPU”用 top。
找某个服务的进程
1 | # 找 java 进程(-a: 所有用户,-u: 显示用户,-x: 包含无终端进程) |
ps aux 输出列含义:
1 | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND |
%CPU:CPU 占用%MEM:内存占用比例RSS:实际占用的物理内存(KB)STAT:进程状态(S睡眠、R运行、Z僵尸)
看 CPU 和内存占用最高的进程
1 | # 按 CPU 降序,取前 10 |
实时监控:top
1 | top |
进入 top 后的常用操作:
P:按 CPU 排序M:按内存排序k:输入 PID 后 kill 进程q:退出
如果服务器装了 htop,用 htop 体验更好(支持鼠标、彩色显示):
1 | htop |
服务管理:systemctl
systemd 是现代 Linux 上最主流的服务管理器,负责系统启动时按顺序拉起各个服务,并在运行期间维护它们的状态。systemctl 是操作 systemd 的命令行工具。Ubuntu 16.04+、CentOS 7+、Debian 8+ 都用 systemd,基本覆盖了所有主流服务器发行版。
服务的启停、状态查看、开机自启都通过 systemctl 管理。
1 | # 查看服务状态(有没有在跑、最近的日志) |
systemctl status 输出示例:
1 | ● nginx.service - A high performance web server and a reverse proxy server |
Active: active (running) 说明服务正常运行;Active: failed 说明启动失败。
日志查看:journalctl / tail / less / grep
journalctl 是 systemd 的日志查看工具,专门读取 systemd 收集的结构化日志,可以按服务名、时间段、日志级别过滤。tail 是通用的文本文件查看命令,用于直接读取磁盘上的日志文件。less 是分页查看器,适合打开大日志文件慢慢翻,不会把终端刷满。grep 不是日志工具,但配合以上三个使用可以快速过滤出包含关键词的行。
两者对应两类日志:journalctl 看 systemd 托管的服务日志(比如 nginx、sshd),tail 看应用自己写到文件的日志(比如 /var/log/app/app.log)。
用 journalctl 查 systemd 服务的日志
1 | # 查看 nginx 最近的日志 |
用 tail 看日志文件
应用自己写的日志文件(不走 systemd)用 tail:
1 | # 实时跟踪日志 |
用 less 分页查看大日志
tail 是实时跟踪,less 是”打开文件慢慢翻”。日志文件几十 MB 时直接 cat 会把终端刷满,用 less 可以分页浏览,还能在文件里搜索。
1 | less /var/log/app/app.log |
进入 less 后的常用操作:
G:跳到文件末尾(查最新日志)g:跳到文件开头/keyword:向下搜索关键词,按n跳下一个,N跳上一个q:退出
less +G 直接打开并跳到末尾,省去手动按 G:
1 | less +G /var/log/app/app.log |
用 grep 过滤关键词
grep 本身是文本搜索工具,配合日志使用时可以快速过滤出包含关键词的行,比翻日志文件高效得多。
在日志里搜关键词
1 | # 搜包含 "Connection refused" 的行 |
网络连通性:ping / curl / dig
这三个命令分别在不同层面测网络:ping 测 IP 层连通,确认能不能到达对方机器;curl 测 HTTP/HTTPS 层,确认接口能否正常响应;dig 测 DNS 解析,确认域名能不能解析到正确 IP。
排查”外部访问不通”时,通常按这个顺序检查:先 ping 确认网络可达,再 dig 确认 DNS 正确,再 curl 确认服务本身没问题。
ping:测服务器是否可达
1 | # 基本测试 |
ping 通说明网络层(IP)可达,但 ping 通不代表服务正常——服务可能没起来,或端口没开。
curl:测 HTTP 接口
1 | # 测接口是否返回正常 |
dig / nslookup:测 DNS 解析
1 | # 查域名解析到哪个 IP |
nslookup 更简单,适合快速查:
1 | nslookup example.com |
traceroute:排查网络路径问题
1 | # 查看到目标的路由路径 |
磁盘和内存:df / du / free
df(disk free)查文件系统级别的磁盘使用,看每个分区还剩多少空间。du(disk usage)查某个目录或文件实际占用了多少空间,适合找出是哪个目录把磁盘撑满了。free 查内存的使用和剩余情况。
服务莫名崩溃,除了看进程和日志,记得用这三个命令确认一下资源有没有被耗尽。
df:查磁盘使用情况
1 | # 查所有挂载点的磁盘使用(-h: 人类可读) |
输出:
1 | Filesystem Size Used Avail Use% Mounted on |
Use% 接近 100% 说明磁盘快满了,服务可能因为写不了日志而崩。
du:查目录大小
1 | # 查当前目录下各子目录的大小 |
磁盘满了先查 /var/log,日志撑满磁盘是常见原因。
free:查内存使用
1 | free -h |
输出:
1 | total used free shared buff/cache available |
available:实际可用内存(比free更准确,包含可回收的 cache;procps-ng 3.3.10+ 才有此列,旧系统可能没有)Swap used过高说明物理内存不够,系统在用交换分区,服务会变慢
服务访问不通时的完整排查顺序
服务访问不通,按这个顺序查:
1 | # 1. 确认服务进程是否在跑 |
大多数”服务挂了”的情况,前四步就能定位:进程死了 → 重启;端口没监听 → 看启动日志;接口报错 → 看应用日志;磁盘满 → 清日志。







