在Linux系统里,判断“启动了哪些服务器”其实就是查看当前有哪些服务进程在运行,核心命令是systemctl和ss,配合ps和netstat就能拿到完整答案。
查看Linux启动了哪些服务器?先分清服务与端口
很多新手会把“服务器”理解成物理机或云主机,但在Linux运维语境里,“启动了哪些服务器”通常指当前系统上运行的服务进程,比如Nginx、MySQL、Apache、SSH(sshd)等,这些服务要么监听网络端口,要么作为后台守护进程常驻内存,要想快速摸清家底,第一步是理解两个概念:
- 服务(Service):由systemd、init等初始化系统管理的守护进程,例如
nginx.service、mysqld.service。 - 端口(Port):服务对外提供能力的网络入口,例如80端口对应Nginx,3306对应MySQL。
行业共识认为,排查“启动了哪些服务器”最可靠的路径是先查服务状态,再验证端口监听,两条线交叉验证就不会遗漏。
linux查看启动了哪些服务器命令:systemctl与ps的取舍
对于主流CentOS、Ubuntu、Debian等使用systemd的发行版,systemctl是首选命令,它直接查询服务管理器本身,输出结果结构化,适合快速浏览全局状态。
用systemctl列出所有服务状态
执行:
systemctl list-units --type=service
这个命令会列出已加载并激活的服务单元,输出中STATE一栏为running的,就是当前正在运行的服务器程序,如果想看到更多细节,比如每个服务的内存占用和主进程PID,可以追加--no-pager避免分页卡住:
systemctl list-units --type=service --state=running --no-pager
这条命令只显示正在运行的服务,去掉了inactive和failed的干扰项,特别适合快速回答“linux启动了哪些服务器”这类问题。
用ps aux补充进程级细节
systemctl的局限在于它只反映服务管理器已知的服务,有些程序以独立进程方式运行(例如手工编译安装的二进制程序、用户的守护脚本),并不在systemd管辖范围内,这时要换用ps:
ps -aux | sort -k3 -nr | less
这个组合会按CPU占用率降序排列所有进程,排在前面的往往是活跃的服务器进程,如果只想看某个特定服务,用
grep过滤:
ps -ef | grep nginx
对比一下两者适用场景:
| 命令 | 优势 | 局限 |
|---|---|---|
systemctl list-units |
输出规范、状态准确、直接关联开机自启 | 不包含非systemd管理的进程 |
ps aux |
覆盖所有用户进程、能看到资源占用 | 输出信息量大,需要额外过滤 |
日常巡检建议先跑systemctl,再用ps兜底查漏。
linux怎么查看后台运行的服务?按需选择查看方式
“后台运行的服务”这个说法很常见,但不同场景下的查看方法完全不同,根据你的实际需求,选对命令能省一半时间。
只看“正在运行”的服务列表
想一眼看全当前活跃服务,用:
systemctl list-units --type=service --state=running
输出样例:
UNIT LOAD ACTIVE SUB nginx.service loaded active running mysql.service loaded active running ssh.service loaded active running
在这个结果里,ACTIVE为running的就是已经在服务器上跑起来的服务,如果你还要知道这些服务分别监听哪些端口,需要结合网络命令。
根据服务名反查进程是否存在
当你知道某个具体服务名(比如Apache的httpd),可以直接查进程:
pgrep -a httpd
pgrep -a会显示进程ID和完整命令行,比ps -ef | grep httpd | grep -v grep更简洁,如果返回非空结果,说明该服务已经在后台运行。
用lsof和ss定位端口对应程序
经常有这种场景:明明感觉服务器启动了Web服务,但浏览器就是打不开,这时重点不是查服务,而是查端口有没有被监听,先看所有监听端口:
ss -tlnp
选项含义:-t显示TCP端口,-l只显示正在监听(listening)的套接字,-n显示数字地址不反查域名,-p显示对应的进程PID和名称,输出示例:
State Local Address:Port Process LISTEN 0.0.0.0:80 nginx LISTEN 0.0.0.0:3306 mysqld LISTEN 0.0.0.0:22 sshd
这样一个表格就直接回答了“linux启动了哪些服务器”Nginx、MySQL、SSH都在监听各自端口,老系统没有ss时,用netstat -tlnp效果类似,指定某个端口反查进程:
lsof -i :3306
返回结果里的COMMAND和PID字段就是占用该端口的服务进程,这个技巧在排查端口冲突时非常实用。
不同Linux发行版下查看服务器服务的命令差异
CentOS 6及更早的版本、部分轻量级系统(如Alpine)还在用SysV init,没有systemctl命令,如果你在这种环境里查服务,需要切换到“老派”命令组合。
SysV init系统查看已启动服务
使用service命令列出所有服务的状态:
service --status-all
这条命令会遍历/etc/init.d/下的脚本,并逐个执行查询,输出中带[ + ]标记的服务代表运行中,带[ - ]或[ ? ]的则是停止或状态不明,需要注意,不同发行版显示格式可能有差异。
查询开机自启服务列表
不论新旧系统,“当前启动了哪些服务器”都只是瞬态情况,很多时候你更需要知道“每次开机都会启动哪些服务器”,systemd系统用:
systemctl list-unit-files --type=service --state=enabled
SysV init系统用:
chkconfig --list
后者会打印每个运行级别的自启状态,对于网络服务器,通常关注3和5这两个级别。
如果遇到既不是systemd也不是SysV init的嵌入式Linux(比如某些路由器固件),常见做法是检查/etc/rc.local或/etc/init.d/目录下的独立脚本,这类系统没有统一的服务查询命令,只能逐个查看进程和端口。
从查看到管理:Linux服务启停与开机自启设置
确认了“启动了哪些服务器”之后,下一个自然动作往往是调整服务状态,这里给出从查询到管理的标准操作路径,覆盖最常见的运维需求。
停止一个正在运行的服务
假设你查到某个不需要的服务器程序占用了资源,可以执行:
systemctl stop nginx.service
执行后再次验证:
systemctl status nginx.service
状态输出中的Active: failed (Result: exit-code)或inactive (dead)都表示服务已经停止,注意stop不管开机自启,重启后服务会再次拉起来。
禁止服务开机自启
只停不治本,如果确认这个服务器程序以后都不需要了,连同自启一起关掉:
systemctl disable nginx.service --now
--now参数会在禁用自启的同时立即停止服务,一步到位,对SysV init系统,对应命令是chkconfig nginx off加service nginx stop。
查看服务日志确认启动过程
有时候服务状态显示failed,但不知道原因,用日志定位:
journalctl -u nginx.service -n 50
-u指定服务名,-n 50显示最近50行日志,常见问题包括端口被占用、配置文件语法错误、权限不足等,这类排查步骤在线上故障处理时非常高频,熟练使用会让排查效率明显提升。
查看linux启动了哪些服务器”的常见问题
如何区分“服务”和“进程”?
服务是systemd或init管理的逻辑单元,进程是操作系统实际运行的程序实例,一个服务可能对应多个进程(例如Nginx有master和worker进程),查看服务用systemctl,查看进程用ps,两者互相补充才能完整理解运行状态。
为什么systemctl查不到某些服务器程序?
手工编译或第三方安装的软件如果不写systemd单元文件,就不会出现在systemctl list-units结果里,这类程序可能由/usr/local/bin下的脚本直接启动,或者跑在screen、tmux会话中,此时用ss -tlnp看端口,再用ps -ef查进程,是更可靠的定位方式。
云服务器上如何快速判断Web服务器是否启动?
先查服务状态,再查端口,两步分离,执行systemctl status nginx httpd(把实际用的Web服务名写进去),如果都没结果,直接看80端口和443端口有没有监听:ss -tlnp | grep -E ':(80|443)',只要有LISTEN状态的输出,说明Web服务器进程确实在运行,只需进一步检查防火墙和安全组放行情况即可。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/734299.html





