在 Linux 系统里查看“安装了哪些服务器”,最快的方法是先跑 systemctl list-units --type=service --state=running,再看 ss -tlnp,两者一结合,正在运行的服务和对应端口全都会现出原形。
很多人会把“服务器”理解成物理机,但在日常运维里,这个词通常指服务端软件,Nginx、Apache、MySQL、Redis、vsftpd 这类程序,Linux 本身不限制你装多少个,所以学会查看已安装的服务和正在监听的端口,是排查故障、安全检查的第一步,下面从命令、包管理、实际场景三个角度带你过一遍。
linux查看已安装服务命令:先分清服务与端口
在 Linux 中,“已安装”和“正在运行”是两个状态,你用 yum install nginx 装了 Nginx,但没启动,那它就不监听端口,所以查看时要分两条线:一条看服务单元,一条看网络端口。
用systemd查看运行中的服务
目前主流发行版(CentOS 7+、Ubuntu 15.04+、Debian 8+)都用 systemd 管理服务,查看正在运行的服务,执行:
systemctl list-units --type=service --state=running
这个命令会列出所有 active 状态的服务,每一行包含服务名、加载状态、活跃状态和简介,如果想看所有已安装的服务,不管有没有在运行,用:
systemctl list-unit-files --type=service
注意,list-unit-files 只显示服务单元文件存在与否,不代表进程活着,系统里有很多系统服务,systemd-journald、dbus,它们属于系统基础组件,不用太在意。
老系统用service和chkconfig
如果你维护的是一台 CentOS 6 或更老的机器,那可能没有 systemd,这时候可以用:
service --status-all列出所有已知服务当前状态chkconfig --list查看开机启动项
Linux 查看已安装服务命令在不同版本上差异不小,老命令在 systemd 系统上也能跑,但只能识别写进 /etc/init.d/ 的脚本,很多新服务不会被列出来,所以优先用 systemctl。
linux查看服务状态用systemctl还是service?对比给你看
实际工作中,你可能会在博客或教程里看到两种写法:systemctl status nginx
和 service nginx status,到底用哪个?这取决于你的系统初始化方式。
| 对比项 | systemctl | service |
|---|---|---|
| 适用系统 | CentOS 7+、Ubuntu 15.04+ | CentOS 6、老 Debian |
| 查看单个服务状态 | systemctl status name |
service name status |
| 查看所有服务 | list-units |
--status-all |
| 对 systemd 服务的支持 | 原生支持 | 需兼容层 |
| 重启服务 | systemctl restart name |
service name restart |
行业共识认为,systemd 已经成为现代 Linux 的标准初始化系统,所以新装的系统直接用 systemctl 就好,service 命令本质上会调用 systemctl,只是语法上兼容老习惯,如果是在脚本里写监控逻辑,为了兼容新旧系统,可以先判断系统里有没有 systemctl 命令再决定用哪种。
很多人在搜索“linux查看服务状态 systemctl和service哪个好”时,其实真正想要的是:一个命令能列出所有正在监听的服务,这时候不要只盯着 systemctl,还得结合端口去查,因为有些服务根本不注册 systemd 单元,比如手动编译安装的 Nginx。
用端口反查服务器程序:ss和netstat实战
对外提供服务的程序一定会占用一个 TCP 或 UDP 端口,反过来,你只要看本机有哪些端口在监听,就能推测出装了哪些服务器。
查看所有监听端口
最推荐的命令是:
ss -tlnp
解释一下参数:-t 只看 TCP,-l 只看监听状态,-n 直接显示端口号而不解析服务名,-p 显示对应的进程信息,输出大概长这样:
LISTEN 0 511 0.0.0.0:80 0.0.0.0: users:(("nginx",pid=1234,fd=6))
看到 0.0.0:80 和 nginx 进程,就知道这台机器装了 Nginx 并正在监听 80 端口。
如果你的系统没有 ss 命令(老版本或精简镜像),可以用:
netstat -tlnp
注意 netstat 在很多新发行版里默认不安装,需要你自己装
net-tools 包。ss 是 iproute2 套件的一部分,几乎必带。
查某个端口被谁占用
假设你想确认 3306 端口是不是被 MySQL 占了,执行:
lsof -i:3306
或者:
fuser 3306/tcp
这两个命令需要额外安装 lsof 或 psmisc,如果没有,也可以直接:
ss -tlnp | grep 3306
这个操作很小,但如果你的服务器被植入了后门,端口反查往往是第一个发现线索的地方。
查已安装的服务器软件包:rpm/dpkg双管齐下
有时候服务进程没在跑,但你想知道这台机器装没装某个服务器软件,这时候要靠包管理器。
红帽系(CentOS / Rocky / Fedora)
用 rpm 查询安装包:
rpm -qa | grep nginxrpm -qa | grep -E 'nginx|httpd|mysql|redis'
rpm -qa 会把所有已安装软件包名全部列出来,比较长,所以必须用 grep 过滤,如果你用的是 yum 或 dnf,也可以这样:
yum list installed | grep httpd
Debian系(Ubuntu / Debian)
用 dpkg 查询:
dpkg -l | grep apache2dpkg -l | grep mysql
Ubuntu 20.04 之后也可以用:
apt list --installed | grep redis
查可执行文件路径
有些服务不是通过包管理器装的,而是源码编译,放到 /usr/local/ 下,这时候用 rpm 或 dpkg 查不到,可以尝试:
which nginxfind /usr/local -name "nginx" 2>/dev/null
但要注意,which 只能查 PATH 目录里的程序,源码安装一般会放进 /usr/local/sbin,你可以单独看这个目录:
ls -l /usr/local/sbin
里面通常躺着 nginx、php-fpm、mysqld 这些可执行文件。
实战场景:怎么判断这台Linux装了什么服务器程序?
无论你用的是简米云 Linux服务器 还是一台自建机房的老机器,刚接手时第一件事就是摸底,以下是一套可执行的流程:
- 看监听端口:执行
ss -tlnp,把所有端口记下来。 - 看服务单元:执行
systemctl list-units --type=service --state=running,确认哪些服务是被 systemd 正常拉起的。 - 查包确认:如果端口显示
80但没看到进程名,用lsof -i:80补查;如果还不行,用rpm -qa | grep -E 'nginx|httpd'看看是不是装了个冷门版本。 - 测一下响应头:
curl -I http://127.0.0.1,如果返回的头里有Server: nginx或者Server: Apache,这就直接告诉你 Web 服务器是谁。 - 查数据库服务:关心 MySQL 或 Redis 是否安装,可以直接搜端口:
ss -tlnp | grep -E '3306|6379'。
这套方法基本零成本,不需要装监控软件,凭一条命令就能确定一台 Linux 服务器对外暴露了几个服务,如果发现端口比你预期多,就要警惕是不是有人私自开了服务。
关于Linux查看已安装服务器的常见问题
为什么我用 netstat 查不到任何端口?
新安装的 CentOS 或 Ubuntu 默认不带 netstat,它会提示命令未找到,这时候用 ss -tlnp 替代。ss 也没有,说明系统太精简,先安装 iproute2,非 root 用户执行 netstat -tlnp 可能看不到进程名,sudo 一下就好。
服务在跑,但 systemctl list-units 里找不到,怎么回事?
手动编译安装的服务,比如你自己下载 Nginx 源码编译,只要没写 systemd unit 文件,systemctl 就看不到它,但这不代表服务没运行,用 ps -ef | grep nginx 和 ss -tlnp 一样能锁定它,同样,用 rpm -qa 也查不到源码安装的软件。
查看服务器硬件信息算不算“查看安装了哪些服务器”?
两者不是一回事,硬件信息看的是机器配置,CPU、内存、磁盘,用 lscpu、free -h、df -h 查看,而“安装了哪些服务器”指的是软件服务,如果你接手一台机器,建议先看硬件,再按上面的流程看软件,这样才能完整评估这台 Linux 的用途和负载。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/715685.html





