在Linux上查看系统启动了哪些服务,本质上就是检查systemd或SysVinit管理的单元状态,最直接的方法是运行systemctl list-units --type=service --state=running。这个命令能一秒列出所有正在运行的服务单元,配合ss或netstat还能看清对应的端口占用,下面我把从入门到进阶的排查思路完整拆开讲,包括服务列表、监听端口、开机自启项以及性能影响,保证你看完就能上手实操。
快速查看正在运行的服务:systemctl 是首选
大多数现代Linux发行版(CentOS 7+、Ubuntu 16.04+、Debian 8+)都使用systemd作为初始化系统,我们要查“启动了什么服务器”,指的就是那些常驻后台、对外提供功能的守护进程,比如Nginx、MySQL、SSH。
最常用三个命令
systemctl list-units --type=service --state=running:列出所有正在运行的服务单元,输出包含服务名、加载状态、活跃状态、描述信息。systemctl list-units --type=service --all:列出所有服务,包括未运行的、退出的、失败的,适合排查“为什么某服务没起来”。systemctl status(不带参数):分页展示系统整体状态,末尾会自动汇总当前正在运行的服务数量。
实际使用中,第一条命令输出可能很长,建议配合grep过滤,比如只看包含nginx的:systemctl list-units --type=service --state=running | grep nginx。
深入理解输出字段
执行systemctl list-units --type=service后,你会看到四列信息:
- UNIT:服务单元名称,例如
ssh.service,这是管理服务的唯一标识。 - LOAD:是否已正确加载到内存,通常都是“loaded”。
- ACTIVE:活跃状态,正运行是“active”,退出是“inactive”,失败是“failed”。
- SUB:更细粒度的状态,running”“dead”“exited”。
业内专家普遍认为,判断一个服务是否真正“启动”,要看ACTIVE列的“active”和SUB列的“running”同时满足,有些人只看ACTIVE是active就放心了,其实像NetworkManager.service这类服务ACTIVE为active但SUB是“running”才正常,而某些oneshot服务active但SUB是“exited”,这是预期行为,不用紧张。
排查特定服务的启动状态
如果怀疑某个服务没起来,直接systemctl status 服务名,比如systemctl status nginx,它会显示该服务是否加载、PID是多少、内存占用、最近日志,这个命令同时回答了“linux怎么查看开机启动的服务”和“某个服务现在跑没跑”两个问题。
linux查看服务器运行状态命令:从进程到端口的完整链路

光看服务列表不够,你还需要确认服务是否真的在监听网络端口,这就是许多运维在排查“linux查看服务器运行状态命令”时的核心诉求。
用 ss 命令查监听端口
现代系统推荐ss,性能比netstat好,执行:
ss -tlnp
- -t 显示TCP端口
- -l 仅显示监听中的socket
- -n 不反解域名,直接显示IP和端口
- -p 显示占用该端口的进程PID和名称
输出里你会看到0.0.0:80或:3306这类监听地址,如果Nginx装了但没监听80端口,说明配置可能有问题或者进程没起来。
用 ps 命令核对进程
ps -ef | grep 服务名能快速看到进程是否存在,但要注意,grep本身也会匹配到一条记录,所以很多人习惯用ps -ef | grep nginx | grep -v grep。
不过我更推荐直接systemctl status,因为系统会明确告诉你主进程PID和子进程情况,不用猜。
端口和服务对照表:快速定位谁占用了端口
| 命令组合 | 作用 | 适用场景 |
|---|---|---|
ss -tlnp |
查看所有TCP监听端口和对应进程 | 想知道哪些服务对外开放了端口 |
ss -ulnp |
查看UDP监听端口 | 排查DNS、NTP等服务 |
lsof -i:8080 |
查看指定端口被哪个进程占用 | 端口冲突时精准定位 |
systemctl status 服务名 |
查看服务日志和运行详情 | 服务异常退出时排查原因 |
比如你发现8080端口被占用,但不知道是谁占的,用lsof -i:8080直接看到PID和进程名,再ps -fp PID确认这是不是你要的服务,这套组合拳在“linux查看系统启动了什么服务”的日常运维中非常实用。
查看开机自启服务:搞清下次重启后谁会启动
“启动了什么服务器”既指当前正在运行的,也指开机后自动运行的,很多人混淆这两个概念,其实systemd把它们分得很清楚。
查看自启状态
systemctl list-unit-files --type=service
这个命令列出所有已安装服务单元文件的启用状态,输出有“enabled”“disabled”和“static”三种:
- enabled:开机自动启动。
- disabled:开机不启动,需要手动启动。
- static:无法直接启用,一般被其他服务依赖,由依赖方触发启动。
配合grep enabled就能筛出所有开机自启的服务:systemctl list-unit-files --type=service | grep enabled

。
单独查某个服务的自启状态
systemctl is-enabled nginx,输出enabled或disabled,再配合systemctl is-active nginx判断当前有没有运行,两个命令一起用就能得出完整结论。
修改自启状态
- 开启自启:
systemctl enable 服务名 - 关闭自启:
systemctl disable 服务名 - 仅临时启动,不改自启:
systemctl start 服务名
这里有个常见的坑:systemctl start只是当前启动,重启后如果状态是disabled,服务照样不会出现,反过来,systemctl enable不会立刻启动服务,只是创建了符号链接,要真正做到“现在跑且下次开机也跑”,需要同时执行start和enable。
没有systemd的老系统怎么办:SysVinit和service命令
如果你还在维护CentOS 6或Ubuntu 14.04这类老系统,就得换一套查看方式。
查看运行中的服务
service --status-all是所有SysVinit服务管理脚本的通用开关,输出里每个服务前会有一个标记:
[ + ]:服务正在运行[ - ]:服务已停止[ ? ]:脚本无法返回状态,需要自己判断
这个命令不如systemd直观,但能快速看到所有注册服务脚本的启停状态。
查看开机自启
SysVinit用chkconfig管理自启:
chkconfig --list
会列出每个服务在各运行级别下的开启状态,例如nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off,表示在运行级别2、3、4、5时自动启动。
对比新老系统查看服务的方法
| 操作 | systemd系统(CentOS7+/Ubuntu16.04+) | SysVinit系统(CentOS6及更早) |
|---|---|---|
| 查看运行中的服务 | systemctl list-units --type=service --state=running |
service --status-all |
| 查看开机自启 | systemctl list-unit-files --type=service |
chkconfig --list |
| 查看单个服务状态 | systemctl status 服务名 |
service 服务名 status |
| 设置开机自启 | systemctl enable 服务名 |
chkconfig 服务名 on |
如果你不确定当前用的是哪种,执行ps -p 1,输出是systemd就按新体系操作,输出是init就按老体系操作。
深入排查:服务启动失败或占用资源过高怎么办
查看服务不只是“看列表”,更重要的是判断服务状态是否健康,下面这些场景你大概率会遇到。
服务一直重启(crashed loop)

服务状态显示“activating (auto-restart)”,说明进程反复崩溃,先journalctl -u 服务名 -n 100看最近的日志,systemd统一了日志管理,不用去翻/var/log/messages,直接按服务名过滤即可。
服务启动但没监听端口
有些服务进程活着,但没对外提供服务,比如Nginx检查配置出错时,主进程可能起不来,但worker进程还在,执行ss -tlnp确认端口是否在监听,再用nginx -t测试配置语法。
高资源占用服务定位
如果服务器CPU或内存告警,需要找出最占资源的服务,用top按P键按CPU排序,按M键按内存排序,看到PID后,用systemctl status PID直接反查它属于哪个服务单元,这个技巧在回答“linux查看服务器运行状态命令”时经常用得上,比一个个服务去猜效率高得多。
常见问题:服务到底存不存在
有时候你运行systemctl status some-service,系统提示“Unit some-service.service could not be found”,这不代表服务没装,可能有三种原因:
- 服务名称不对,比如
mysqld和mysql可能是两个不同的单元。 - 服务由第三方软件包提供,但没安装对应的systemd unit文件。
- 服务被隐藏在别的目录,比如用户级服务,用
systemctl list-unit-files --type=service --all看完整列表,或者用systemctl list-units --type=service --all | grep 关键词模糊搜索。
Q&A:关于查看Linux启动服务的三个常见疑问
systemctl list-units和systemctl list-unit-files有什么区别?
list-units展示的是当前系统内存中加载的单元状态,涉及运行中、已退出、失败的服务,反映的是“现在时”。list-unit-files展示的是磁盘上unit文件的配置状态,即enabled或disabled,反映的是“下一次开机后”,两者是互补关系,前者管现状,后者管自启策略。
为什么ss -tlnp需要root权限才能看到进程名?
普通用户执行ss -tlnp时,如果没有sudo,进程名和PID列显示不出来,只能看到端口,这是因为/proc目录下部分进程信息对普通用户不可见,解决方法是sudo ss -tlnp,否则只能确认端口占用,无法确认是哪个服务进程在监听。
Linux下有没有类似Windows任务管理器一样的服务查看界面?
严格意义上的图形化服务管理器不多,但htop配合systemctl基本能满足需求。htop能直观看到所有线程的CPU和内存占用,按F4搜索进程名,再对照systemctl status确认服务归属,对于纯命令行环境,这条组合是目前最高效的服务状态检查方式。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/824779.html


评论列表(4条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于服务名的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是服务名部分,给了我很多新的思路。感谢分享这么好的内容!
读了这篇文章,我深有感触。作者对服务名的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是服务名部分,给了我很多新的思路。感谢分享这么好的内容!