在CentOS系统上查看运行着哪些服务器,本质上就是查看当前系统运行了哪些服务、进程以及监听了哪些端口,核心工具是systemctl、ps、ss和lsof。把这几条命令组合起来,你就能在五分钟内摸清一台服务器的底细,下面咱们从最常用到最底层,一层层拆开讲。
先想清楚一个问题:你要查的是服务、进程,还是端口
很多人一上来就敲命令,结果查出来的东西和想象中完全对不上,原因在于“运行着哪些服务器”这句话在不同场景下指的东西不一样。
- 服务(Service):通过systemd管理的守护进程,比如nginx、mysqld、httpd,这类东西用
systemctl查。 - 进程(Process):系统里所有正在跑的程序实例,包括非systemd管理的杂项进程,这类用
ps和top查。 - 端口(Port):某个服务到底占用了哪个端口,以及谁在监听这个端口,这类用
ss和lsof查。
行业共识认为,排查问题时要先定位是服务级别的问题还是端口级别的问题,否则容易绕远路。
三个概念混在一起会出什么乱子
举个例子,你用systemctl status nginx看到服务是running,但网页就是打不开,这时候如果只盯着服务状态,永远找不到原因,真正的问题可能是nginx没监听80端口,或者监听在了一个错误IP上,反过来,你用ss -tlnp看到8080端口被占用了,但不知道是哪个程序占的,照样没法处理,所以这三个维度缺一不可,接下来逐个看命令。
centos 7系统 查看运行的服务,优先使用systemctl命令
CentOS从7代开始全面使用systemd替代了旧的SysVinit,service和chkconfig命令虽然还兼容,但展示的信息远不如systemctl直观。
systemctl list-units 查看所有活跃服务
最直接的一条命令是:
systemctl list-units --type=service --state=running
这条命令会列出所有正在运行的service单元,每行显示服务名、加载状态、活跃状态和简要描述,输出比较长,建议配合管道过滤,比如你想看有没有和数据库相关的服务:
systemctl list-units --type=service --state=running | grep -i sql
-i参数忽略大小写,这一招在你记不住服务全名的时候特别管用。
systemctl status 查看单独一个服务的运行细节
如果你知道服务大概叫什么名字,直接加状态查询:
systemctl status mysqld
输出结果会包含主进程PID、内存占用、CPU时间、最近几条日志信息,这个命令最大的价值在于:它把服务状态、进程信息和最近日志聚合到了一起,遇到服务启动失败的情况,这里直接能看到失败原因,省得再翻日志文件。
查所有服务而不只是一部分
记住一个技巧:不带
--state=running参数是查看所有服务,包括已经退出的和被禁用的:
systemctl list-units --type=service
这条输出能看到哪些服务处于failed状态,在清理服务器时,关注failed状态的服务往往能发现历史遗留问题。
顺手查一下开机自启项
要了解一台服务器“平时都在干什么”,光看当前运行的不够,还得看开机自启:
systemctl list-unit-files --type=service | grep enabled
很多运维事故的根源,就是某个服务上次启动之后就死了,但系统重启后它又自己拉起来,占用了你没想到的端口,这条命令帮你提前看到这些“潜伏者”。
centos查看服务端口占用,用ss和netstat定位监听状态
知道有哪些服务运行只是第一步,很多冲突问题的根源是端口,而不是服务本身,比如你启动了一个新应用,提示端口被占用,你得立刻查出是谁占的。
ss命令是CentOS 7之后推荐的工具
ss -tlnp
参数拆开解释:
-t:只看TCP连接。-l:只看监听状态的端口。-n:不做域名反解,直接显示IP和端口号,速度快且干净。-p:显示占用端口的进程PID和名称。
输出结果中Local Address:Port那列就是本机监听地址和端口,Process那列直接告诉你是哪个程序,这条命令在所有CentOS版本上都能用,不需要额外安装。
指定要查具体端口,过滤即可
端口太多了一屏看不完,精准定位更快:
ss -tlnp | grep :80
冒号不能省略,不然会把所有包含80的IP地址、端口全滤出来,干扰判断,记得在端口后面加结尾符更精确:
ss -tlnp | grep ':80 '
后面跟一个空格,彻底避免匹配到8080、8000这类干扰项。
netstat命令在一些旧版本上仍然有价值
CentOS 6或者更老的环境里,ss命令可能不存在(虽然少),netstat是当时的标配:
netstat -tlnp
参数含义和ss完全一致,CentOS 7及更高版本里netstat可能没默认安装,你需要先装net-tools工具包:
yum install -y net-tools
如果你在一个内存极其有限的服务器上,装net-tools显得笨重,用ss就够了,如果你是在熟悉的旧机器上操作,用netstat也完全没问题,两者输出格式很接近。
用lsof按进程反查端口
换个思路:你看到一个进程叫java,想搞清楚它到底占用了哪些端口,这时候ss不太好用,因为它需要你从一堆进程里翻,用lsof一步到位:
lsof -i -P -n | grep java
-i表示查看网络相关的文件,-P
禁用端口名解析(直接显示数字端口),-n禁用域名反解,这条命令的输出会列出java进程所有已建立的连接和监听端口,lsof通常不是默认安装的,需要单独装:
yum install -y lsof
综合来看,日常排查时用ss查端口,用lsof按进程查端口,两者配合几乎覆盖所有场景。
用ps和top查看真正的底层进程状态
systemctl查的是systemd视角下的服务,但服务器上跑的进程不止这些,还有其他非托管程序,这时候回到最底层,用ps查看进程快照。
ps aux:查看完整进程列表
ps aux
这是Linux上最经典的进程查看命令,输出内容包括用户、PID、CPU占用、内存占用、虚拟内存、物理内存、终端、状态、启动时间、具体命令,搜索关键词是这个命令的精髓:
ps aux | grep python
grep前面最好加个[p]技巧防误匹配:
ps aux | grep [p]ython
这个技巧很老套但非常实用,不加方括号时,grep那条命令自身也会被匹配出来,多一行无用输出,干扰判断。
ps -ef:看到父子进程关系
ps aux的格式偏BSD风格,ps -ef则是标准风格,多了PPID(父进程PID)列:
ps -ef
看父子关系对你诊断问题极有帮助,比如你看到一堆nginx进程,PID各不相同,用ps -ef能看出谁是谁的主进程、谁是工作进程,主进程挂掉后,工作进程全部成孤儿,这通常是配置错误或崩溃的信号。
top:实时刷新查看资源占用大户
top命令一执行就进入交互界面,默认按CPU占用率排序,每三秒刷新一次,在一台卡顿的服务器上,第一眼就该看top,找出CPU或内存占用最高的那个进程,这就是问题的核心。
几个交互快捷键:
M:按内存占用排序。P:按CPU占用排序。k:输入PID直接杀掉进程。q:退出。
按内存排序在排查内存溢出时异常高效,比如你的服务器内存用了90%,按M一看,最顶上一个java进程占了60%,问题定位基本完成。
实战场景:接手一台全新服务器怎么快速摸清家底
把前面这些命令串起来,形成一套操作流程。
第一步:查看服务列表
systemctl list-units --type=service --state=running
这一步摸清当前有多少服务在跑,心里有个大框架,如果服务数量超过50个,这台机器的运行情况就偏复杂了,建议把不用的服务停掉并禁用。
第二步:抓出监听端口
ss -tlnp
把监听的端口列出来,结合上一步的服务名,一一对应起来,一个端口对应一个服务,如果发现某个端口没有任何已知服务对应,立马查进程。
第三步:按端口反查进程
lsof -i :8080
此时如果你的服务列表里没有8080,但lsof显示这个端口被某个不明程序占用,基本可以确定这台服务器上有来路不明的程序在运行,安全审计的关键就在这一轮。
第四步:确认系统整体运行时长和负载
uptime
这条命令虽然简单,但信息量不小:系统当前时间、运行时长、登录用户数、过去1分钟/5分钟/15分钟的平均负载,如果15分钟负载远高于1分钟负载,说明系统正在经历高峰压力;反过来如果1分钟负载特别高,说明刚刚发生了突发状况。
数据备份与定期巡检的落地建议
一个在上线时记录所有服务和端口的基准文档,比任何监控工具都实用,操作方式是在刚搭建完服务器、所有服务都正常运行的时候,执行一次:
systemctl list-units --type=service --state=running > /root/service_baseline.txt ss -tlnp > /root/port_baseline.txt
保存好这两个文件,平时巡检时再执行一遍同样的命令,把输出和基准文件做对比,差异之处就是需要重点关注的对象,用diff直接比对:
diff /root/service_baseline.txt <(systemctl list-units --type=service --state=running)
这套方法不需要任何额外软件,只需要一个文件去保存基线数据,据工信部公开信息,近年来国内企业服务器操作系统中CentOS系列曾占据较大比例,系统管理员掌握这套基线对比思路,能显著降低运维误操作风险。
常见疑问解答
centos查看运行着哪些服务器,最推荐的命令组合是什么?
先执行systemctl list-units --type=service --state=running看服务全貌,再执行ss -tlnp看端口监听情况,最后用ps aux按需验证具体进程,这三条命令覆盖了服务、端口、进程三个维度,处理多数排查场景已经足够。
systemctl和ps查出来的结果不一样,这是怎么回事?
systemctl只管理systemd注册过的服务,ps查看的是系统全部进程,有些进程是用户直接启动的、临时执行的或者由脚本拉起的,并不在systemd的管理范围内,所以ps显示的进程数大于等于systemctl显示的服务数,这种情况正常,但如果一个服务在systemctl里是active,ps里却完全找不到对应进程,那多半是状态不同步或服务僵死,需要重启服务。
查看服务器上的运行服务需要root权限吗?
查看当前用户权限能看到的进程,普通用户执行ps aux能看到所有进程的基本信息,但ss -tlnp输出其他用户进程的PID和名称时需要root权限,没有root权限时ss -tlnp会隐藏进程信息列,只显示端口监听状态,生产环境建议通过sudo执行这些命令,避免权限不足导致信息不完整而误判。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/697662.html





