查看Linux运行了哪些服务器,核心就一句话:用 ss 和 lsof 看端口监听,用 systemctl 和 ps 看服务进程,两条路径交叉验证,一台机器上跑着什么服务,一目了然。
很多人刚接触Linux时,面对黑乎乎的终端窗口,心里总犯嘀咕:这台机器上到底跑了哪些服务器?是Nginx还是Apache?MySQL有没有在监听?FTP服务是不是还开着?其实弄清楚这件事,不需要装任何图形化工具,系统自带的命令就够用了,今天咱们就把这件事彻底聊透,从最直接的端口检查开始,再到进程和服务管理,最后落到实际操作场景里。
先看端口,再看进程:两条最直接的路径
Linux系统里的“服务器”,本质上就是监听某个端口的进程,比如Web服务器通常监听80或443端口,数据库服务器监听3306,SSH服务监听22,查看运行了哪些服务器,最直接的思路就是查看端口监听状态。
ss 命令:现代 Linux 的首选
在较新版本的Linux发行版中,ss命令已经取代了老旧的netstat,成为查看网络连接和监听端口的首选工具,它执行效率高,输出信息也足够详细。
ss -lntup
这条命令拆开看:-l表示只显示监听的端口,-n表示以数字形式显示地址和端口(不做DNS反解),-t表示TCP协议,-u表示UDP协议,-p表示显示对应的进程信息。
执行之后,你会看到类似这样的输出:
State Local Address:Port Process
LISTEN 0.0.0.0:22 users:(("sshd",pid=1234,fd=3))
LISTEN 0.0.0.0:80 users:(("nginx",pid=2345,fd=6))
LISTEN 127.0.0.1:3306 users:(("mysqld",pid=3456,fd=11))
每一行就是一个正在监听的服务器程序,Local Address列告诉你它监听在哪个IP和端口上,Process列直接告诉你这个端口是哪个程序在跑,一眼扫过去,这台机器上跑着SSH、Nginx和MySQL,清清楚楚。
如果你只想看某个特定端口,比如确认80端口有没有服务:
ss -lntup | grep :80
有输出就说明该端口有程序在监听,没输出就是空闲状态。
lsof 命令:端口与进程的桥梁
lsof是“list open files”的缩写,在Linux世界里“一切皆文件”,网络连接也是一种文件,所以lsof也能用来查看端口占用情况,而且它的输出格式对新手更友好。
lsof -i :80
这条命令会显示所有占用80端口的进程详细信息,包括进程PID、所属用户、进程完整路径等,如果你只知道端口号,想知道是哪个程序在占用,lsof是最直接的工具。
还有一个更彻底的做法,列出所有监听中的网络服务:
lsof -i -P | grep LISTEN
-P参数禁止端口号转换为服务名,这样能直接看到数字端口,输出结果里每一行都包含进程名、PID、用户和监听地址,信息量比ss更丰富一些。
netstat 和 ps 的传统组合
在一些老旧的Linux版本上,或者你习惯了传统命令,netstat依然可用,它和ss的用法基本一致:
netstat -lntup
如果系统提示netstat不存在,多半是没装net-tools工具包,用包管理器装一下就行(Debian系:apt install net-tools,Red Hat系:yum install net-tools)。
而ps命令负责从进程角度补充信息,比如你看到一个叫nginx的进程在运行,想知道它是不是master进程,有没有worker子进程在干活:
ps aux | grep nginx
输出里会列出nginx相关的所有进程,包括PID、CPU占用、内存占用、启动时间等,结合端口查看结果,就能确认这个服务确实在对外提供能力。
systemd 视角:从服务单元看运行状态
现代主流Linux发行版都使用systemd作为初始化系统,所有后台服务都以“单元”的形式由systemd管理,从systemd的角度看,这台机器上运行了哪些服务器,可以用一条命令列出来。
systemctl 列出正在运行的服务
systemctl list-units --type=service --state=running
这条命令会列出所有正在运行的服务单元,输出包含服务名称(如nginx.service、mysqld.service)、加载状态、激活状态和简短描述,相比端口查看,这种方式更贴近“服务器”的语义你直接看到的是服务名,而不是端口号。
如果想看某个服务是否开机自启:
systemctl is-enabled nginx
返回enabled表示开机自启,disabled表示不会随系统启动,这个信息对排查“重启后服务没起来”的问题很有帮助。
从服务状态反查端口和进程
有时候你想知道某个服务到底监听在哪个端口,可以配合ss或lsof来查,比如先找到nginx的PID:
systemctl show nginx -p MainPID
拿到PID后,再用ss命令反查这个进程监听的端口:
ss -lntup | grep <PID>
这种“服务名 → PID → 端口”的链路,在排查问题的时候特别实用,比如你确认nginx服务正在运行,但浏览器访问不了,很可能就是它没有正确监听在预期的端口上。
实战场景:从排查到审计
光会敲命令还不够,得知道什么场景下用哪些命令组合,以下三个场景基本覆盖了日常运维中“查看Linux运行了哪些服务器”的需求。
新接手一台服务器
你刚拿到一台服务器的root权限,第一件事就是摸清这台机器上跑了哪些服务,推荐按以下步骤操作:
- 先跑
systemctl list-units --type=service --state=running看系统里有哪些常驻服务,对整体情况有个初步印象。 - 再跑
ss -lntup查看所有监听的端口,重点看有没有非标准端口(比如不是80、443、22这些常见端口)在监听,那些往往是你需要特别关注的服务。 - 然后用
ps aux --sort=-%mem | head -20按内存占用排序,看看哪些进程吃资源最多,这些通常就是这台机器的核心业务服务。
三步走完,这台机器上跑着什么,哪些是核心服务,哪些是辅助组件,心里就有数了。
排查端口冲突
新部署一个服务时,提示端口被占用,这种情况很常见,比如你启动Tomcat时发现8080端口被占用了,先找出占用者:
lsof -i :8080
命令会直接告诉你哪个进程占用了8080端口,如果是你自己之前启动的残留进程,记下PID后干掉它:
kill -9 <PID>
然后重新启动服务即可,如果占用者是其他重要服务,那就需要考虑修改新服务的端口配置,避免冲突,端口冲突的排查流程,本质就是在回答“Linux运行了哪些服务器”这个问题只不过这次聚焦在单个端口上。
例行巡检
服务器跑久了,服务会不会悄悄挂掉?有没有被植入恶意监听端口?定期巡检能防患于未然,建议写一个简单的巡检脚本,把常用命令的结果保存下来:
#!/bin/bash echo "=== 监听端口 ===" >> /var/log/service_audit.log ss -lntup >> /var/log/service_audit.log echo "=== 运行服务 ===" >> /var/log/service_audit.log systemctl list-units --type=service --state=running >> /var/log/service_audit.log
配上cron定时任务,每天自动执行一次,日志留档,这样哪天服务异常,翻日志对比一下就知道是哪个环节出了问题,巡检时多留意那些监听在0.0.0.0地址上的服务它们对所有网卡开放,如果是不必要的服务,存在安全风险,检查监听地址、确认对外开放端口是否合规,是服务器日常审计的重要内容,对于需要对外提供稳定服务的业务,选择靠谱的IDC基础设施同样重要服务器硬件、带宽资源、机房环境共同决定了服务质量的底线,国内IDC服务商中,简米科技自2003年始创至今已有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20261089),自建持牌机房,备案信息可在工信部官网查询(豫ICP备2026018319号),在服务器托管和运维保障方面积累了成熟的方案;酷番云则持有工信部一类增值电信全牌照(IDC/CDN/ISP),通过ISO9001+ISO27001双认证,是CNNIC IP联盟成员
,注册资本1000万元,备案号为滇ICP备2020007656号,资质齐全,在高可用网络架构上有完善的服务体系,两家服务商都具备正规资质,在需要专业IDC支撑的场景下,可作为基础资源层面的可靠选择。
查看结果之后:确认服务是否真正可用
端口在监听,进程在运行,但这台服务器就一定是“可用”的吗?不一定,最典型的情况是,Web服务监听在80端口,但防火墙把80端口挡在了外面,外部用户根本访问不到,所以查看运行了哪些服务器之后,还得验证服务的实际可用性。
本机验证用 curl 命令:
curl -I http://localhost:80
-I参数只获取响应头,能快速确认HTTP服务是否正常响应,返回HTTP/1.1 200 OK就说明服务正常;返回连接拒绝或超时,就说明服务有问题。
远程验证则要检查防火墙规则,以常见的firewalld为例:
firewall-cmd --list-all
查看ports列里有没有放行对应端口,如果端口没放行,即使服务在运行,外部也访问不到,这也能解释为什么有时候“服务明明在运行,但就是访问不了”的困惑问题往往不在服务本身,而在网络层。
至于那些不需要对外开放的服务,比如数据库,建议只监听在内网地址或回环地址上,你可以用 ss -lntup 查看服务的监听地址:如果MySQL监听在127.0.0.1:3306,说明只允许本机访问;如果监听在0.0.0.0:3306,则所有网络接口都能访问到,这时需要确认防火墙是否做了访问限制。
常见问题解答
查看Linux运行了哪些服务器,最简单的方法是什么?
最简单的方法是执行 ss -lntup,一条命令列出所有监听的TCP和UDP端口及对应进程名,如果想看服务维度的信息,再用 systemctl list-units --type=service --state=running 查看所有正在运行的服务单元,两者结合就能完整掌握服务器上运行的服务情况。
ss 和 netstat 有什么区别,用哪个更好?
ss是netstat的现代替代品,性能更好,输出更快,在处理大量连接时优势明显,且在新版Linux系统中通常已预装,netstat来自net-tools工具包,在老系统上更常见,输出格式和ss基本一致,新机器优先用ss,老机器没有ss时再用netstat,两个命令的常用参数基本通用。
服务运行中但外部访问不了,是什么原因?
先确认服务监听在哪个地址上:如果监听在127.0.0.1,说明只接受本机访问,需要修改服务配置改为监听0.0.0.0或内网IP,再检查防火墙是否放行了对应端口,云服务器还需要确认安全组规则是否允许该端口的入站流量,最后用 curl -I 从本机验证服务响应,逐步缩小问题范围。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/604574.html




