日常学习运维工作时,最常遇到的问题莫过于「端口占用启动失败」「进程挂掉无响应」「服务起不来找不到原因」。其实这类基础排错不用慌,掌握一套固定的排查逻辑,就能快速定位问题、高效解决。
核心原则:先定位现象 → 再查找根源 → 最后安全处理,不盲目操作,避免误删进程、误关服务。
一、端口占用排查
场景举例:启动Nginx、Tomcat、MySQL等服务时,提示「Address already in use」(地址已被占用),此时优先排查端口占用。
1. 第一步:确认占用端口的具体信息
核心命令(必记):netstat 或 ss(推荐用ss,先前写过为什么学会了net-tools,还需要学习iproute2?),搭配grep过滤目标端口。
常用组合命令(替换80为你的目标端口,如3306、8080):
# 方法1:ss 命令
ss -tulnp | grep 80
# 方法2:netstat命令(若提示command not found,先安装:yum install net-tools -y)
netstat -tulnp | grep 80
命令解读:
- -t:显示TCP端口(常用,如服务端口)
- -u:显示UDP端口(较少用,按需添加)
- -l:显示监听状态的端口(正在被服务使用的端口)
- -n:不解析域名/服务名,显示纯端口号(提速,避免卡顿)
- -p:显示占用端口的进程ID(PID)和进程名(关键!定位哪个程序占用)
2. 第二步:判断进程是否合法
通过上面的命令,会输出类似结果:
tcp LISTEN 0 128 :::80 :::* users:(("nginx",pid=1234,fd=6))
关键信息:pid=1234(进程ID),进程名=nginx(占用端口的程序)
判断逻辑:
- 若进程名是你预期的服务(如nginx、mysql):说明服务已启动,无需重复启动,或修改新端口。
- 若进程名陌生/异常(如不是你部署的程序):可能是垃圾进程、异常进程,需进一步确认是否安全。
3. 第三步:处理端口占用
⚠️ 注意:处理前务必确认进程是否无用,避免误杀核心进程(如sshd、systemd),否则会导致服务器失联。
-
方案1:停止占用端口的合法服务(推荐,若服务重复启动)
以 nginx 为例,停止服务(根据进程名调整命令)
systemctl stop nginx若想禁止开机自启,避免后续再占用:
systemctl disable nginx -
方案2:强制杀死异常/无用进程(仅陌生进程使用)
替换1234为上面查到的PID执行
kill -9 1234验证:再次执行
ss -tulnp | grep 80,无输出即杀死成功 -
方案3:修改目标服务的端口(若需保留两个服务同时运行)
例如:Tomcat 占用 8080,想启动另一个 Tomcat,可修改 conf/server.xml 中的端口,重启即可。
避坑点
不要直接kill -9所有占用端口的进程!比如查到pid=22的进程占用端口,先执行ps -ef | grep 22确认进程详情,避免误杀sshd(远程连接进程)。
二、进程异常排查(进程挂掉/无响应/CPU/内存过高)
场景举例:服务启动后很快挂掉、进程占用CPU 100%、服务器卡顿,排查进程异常。
核心思路:先找到异常进程 → 查看进程详情/日志 → 分析原因 → 重启/杀死/优化。
1. 第一步:查看所有进程,定位异常进程
常用命令(按需选择):
# 方法1:查看所有进程(平铺显示,带 PID 和进程名)
ps -ef
# 方法2:查看进程占用 CPU/内存排序(重点找占用过高的进程,按 CPU 排序)
top # 实时刷新,按 P 键按 CPU 排序,按 M 键按内存排序,按 q 键退出
# 方法3:过滤指定进程(如查看 nginx 相关进程)
ps -ef | grep nginx
异常判断标准:
- CPU/内存占用长期≥80%(大概率异常,需排查);
- 进程状态异常(如top中显示Z+,即僵尸进程,无法正常终止);
- 服务进程频繁重启(如Tomcat启动后几秒就挂掉)。
2. 第二步:查看异常进程详情(找根源)
核心命令:根据PID查看进程的启动命令、运行状态、占用资源等。
# 替换1234为异常进程的PID
ps -aux | grep 1234
# 查看进程的启动路径(关键,确认是否是你部署的程序)
ls -l /proc/1234/exe
补充:若进程是服务(如 nginx、mysql),优先查看服务日志,日志是排错的核心!
# 常见服务日志路径(按需调整)
# nginx 日志
tail -f /var/log/nginx/error.log
# mysql 日志(默认路径,若修改过需调整)
tail -f /var/log/mysqld.log
# 系统日志(排查系统级进程异常)
tail -f /var/log/messages
日志解读:重点看「error」「failed」「killed」等关键词,快速定位异常原因(如配置错误、权限不足、内存溢出)。
3. 第三步:处理异常进程(按需操作)
-
情况1:进程无响应、CPU/内存过高(合法服务)
先尝试优雅重启服务(推荐,避免数据丢失)
systemctl restart nginx若重启失败,再强制杀死进程,重新启动
kill -9 1234和systemctl start nginx -
情况2:僵尸进程(Z+ 状态)僵尸进程是进程已终止,但父进程未回收,一般不占用过多资源,若数量过多,重启父进程即可:
查看僵尸进程的父进程PID(PPID)
ps -ef | grep Z+杀死父进程(替换456为PPID)
kill -9 456 -
情况3:异常陌生进程(疑似病毒/垃圾进程) 杀死进程后,建议检查进程的启动路径,删除对应的异常文件,避免再次启动。
三、通用排错补充
很多时候,端口/进程异常不是进程本身的问题,而是系统环境、权限、配置导致的,补充3个高频排查点:
1. 防火墙排查(能ping通,但无法访问)
CentOS 7默认开启firewalld防火墙,若端口未开放,会导致服务无法外部访问,排查命令:
# 查看已开放的端口
firewall-cmd --list-ports
# 若目标端口未开放,临时开放(重启失效)
firewall-cmd --add-port=80/tcp --permanent
# 重新加载防火墙,使配置生效
firewall-cmd --reload
2. 权限排查(日志提示permission denied)
原因:进程启动用户无对应文件/目录的读写执行权限,处理方法:
# 以nginx为例,给启动用户授权(替换 nginx 为用户,/usr/local/nginx 为服务路径)
chown -R nginx:nginx /usr/local/nginx
chmod -R 755 /usr/local/nginx
3. 系统资源排查(进程频繁挂掉,无明显错误日志)
可能是服务器内存、磁盘不足,导致进程被系统杀死,排查命令:
# 查看内存使用情况(free -h 更易读)
free -h
# 查看磁盘使用情况(重点看 / 根目录,使用率 ≥ 90% 会导致进程异常)
df -h
处理:清理无用文件、日志,释放内存/磁盘空间,再重启服务。
四、总结
新手记住这套流程,能解决大多的CentOS 7端口/进程基础排错:
- 端口占用:ss/netstat找 PID → 判断进程合法性 → 停止服务/杀进程/改端口;
- 进程异常:top/ps找异常进程 → 看进程详情/日志找根源 → 重启/杀进程/优化;
- 补充排查:防火墙、权限、系统资源(内存/磁盘),避免遗漏隐藏问题。
排错的核心是「循序渐进」,不要上来就强制kill进程,多查看日志、确认进程详情,才能避免误操作。如果遇到特殊场景(如进程杀不死、端口被内核占用),则需要更深入的排查方法~