如何列出 Linux 上正在运行的服务:适用于各种 init 系统的完整指南
快速解答:如何列出 Linux 上正在运行的服务
要在 Linux 上列出正在运行的服务,请根据你所用的 init 系统,选用下面的命令之一:
- systemd(Ubuntu 24.04、Debian 12、CentOS/RHEL 9、Fedora 40+,以及 2026 年绝大多数现代发行版):
或者,不管状态如何,列出所有服务单元:systemctl list-units --type=service --state=runningsystemctl --type=service - SysVinit / 较旧的系统(或想连传统 init 脚本一并纳入时):
service --status-all
如今,systemd 几乎是所有主流 Linux 发行版的默认 init 系统,所以在绝大多数情况下,systemctl list-units --type=service --state=running 就是答案。它会打印出一张当前处于活动状态的服务表,列出各自的 LOAD、ACTIVE 和 SUB 状态。如果提示找不到 systemctl,说明你的系统没有运行 systemd——请改用 service --status-all(SysVinit)或 rc-status(OpenRC)。
本指南后续会详细介绍每种方法,包括按状态筛选、查看开机自启的服务,以及按端口查找服务。
引言
Linux 服务是持续运行的后台进程,负责执行各类系统任务,比如管理网络、处理用户登录、运行 Web 服务器等。这些服务可以通过多种工具来管理,具体取决于所用的 Linux 发行版和 init 系统。截至 2026 年,systemd 已是几乎所有主流发行版的标准 init 系统,因此本指南的大部分内容都围绕 systemctl 命令展开。
会列出正在运行的服务,对系统管理员和开发者来说是一项必备技能。它能帮你:
- 排查故障 —— 确认某个关键服务是在运行还是已经出错。
- 监控性能 —— 找出占用资源较多的服务。
- 安全审计 —— 确保只有必要的服务处于活动状态。
使用 systemctl(适用于基于 systemd 的系统)
大多数现代 Linux 发行版都以 systemd 作为 init 系统,其中就包括 2026 年当前的各个版本,例如 Ubuntu(16.04 到 24.04 LTS 及更新版本)、Debian(8 到 12 "Bookworm" 及更新版本)、Fedora(40+)、CentOS Stream / RHEL / Rocky Linux / AlmaLinux(7 到 9 及更新版本)以及 openSUSE。在所有这些系统上,systemctl 都是管理和列出服务的主要工具。
查看单个服务的状态
要确认某个具体服务是否在运行,请使用:
systemctl status <service-name>
例如,想查看 nginx Web 服务器是否在运行:
systemctl status nginx
输出会显示该服务是活动(运行中)、未活动还是失败,并附带便于调试的日志。
列出所有活动的服务
要列出所有正在运行的服务,请使用:
systemctl list-units --type=service --state=running
这条命令会以表格形式显示当前所有正在运行的服务及其状态。
列出所有服务(含未活动的)
如果你想查看所有服务,不管它们是否在运行:
systemctl list-units --type=service
这会一并列出处于活动、未活动、失败或其他状态的服务。
按状态筛选服务
你可以按服务的状态进行筛选:
systemctl list-units --type=service --state=failed
这样只会列出失败的服务,排查故障时特别有用。
列出开机自启的服务
要查看哪些服务被设置为开机时自动启动:
systemctl list-unit-files --type=service | grep enabled
输出示例
systemctl list-units --type=service --state=running 的典型输出大致如下:
UNIT LOAD ACTIVE SUB DESCRIPTION
cron.service loaded active running Regular background program processing daemon
networking.service loaded active running Raise network interfaces
ssh.service loaded active running OpenBSD Secure Shell server
systemd-logind.service loaded active running Login Service
小结
- 用
systemctl status <service>查看单个服务的状态。 - 用
systemctl list-units --type=service --state=running列出活动的服务。 - 用
systemctl list-units --type=service查看所有服务。 - 用
systemctl list-unit-files --type=service查看开机自启的服务。
使用 ps 和 grep 查看运行中的进程
如果你不想依赖 systemctl 或其他服务管理工具来列出运行中的服务,可以用 **ps(process status,进程状态)**配合 grep 来查找特定进程。
这种方法在以下场景很有用:
- 你用的是一套精简的 Linux 系统,没有
systemctl或service命令。 - 你只想确认某个进程是否在运行,而不关心底层是哪种 init 系统。
列出所有运行中的进程
ps aux 命令会显示系统上所有正在运行的进程:
ps aux
它会输出一份完整的进程列表,包含各进程的进程 ID(PID)、CPU 占用、内存占用和命令名称。
查找特定服务
要确认某个服务是否在运行,请使用 ps aux | grep <service-name>:
ps aux | grep nginx
这会输出所有包含 "nginx" 的行,从而看出它是否在运行。输出大致如下:
root 1034 0.0 0.3 49536 3412 ? Ss 12:34 0:00 nginx: master process /usr/sbin/nginx
www-data 1035 0.0 0.2 49536 2824 ? S 12:34 0:00 nginx: worker process
user 2045 0.0 0.0 14856 900 pts/0 S+ 12:35 0:00 grep --color=auto nginx
其中:
- 前两行表明 nginx 服务正在运行。
- 最后一行(
grep --color=auto nginx)其实是grep命令本身。你可以用下面的方式把它排除掉:
ps aux | grep nginx | grep -v grep
以层级结构显示进程
想看得更有条理,可以使用:
ps fax
它会以树状结构显示正在运行的进程,让你更容易看清哪些服务在运行,以及它们各自的子进程。
按端口查找服务
如果你怀疑某个服务运行在特定端口上,却不确定它的服务名,可以使用:
netstat -tulnp | grep :80
或者,如果没有 netstat:
ss -tulnp | grep :80
这会列出占用 80 端口的进程(该端口通常被 Nginx、Apache 等 Web 服务器使用)。
小结
- 用
ps aux列出所有正在运行的进程。 - 用
ps aux | grep <service-name>查找特定服务。 - 用
ps fax以树状图查看进程。 - 用
netstat -tulnp或ss -tulnp查找运行在特定端口上的服务。
常见问题解答(FAQ)
1. 如何检查 Linux 上某个服务是否正在运行?
你可以根据自己的 Linux 发行版选用不同的方法:
- 基于 systemd 的系统:
systemctl status <service-name> - 基于 SysVinit 的系统:
service <service-name> status - 使用 ps 和 grep:
ps aux | grep <service-name>
2. 如何列出所有正在运行的服务?
- 基于 systemd 的系统:
systemctl list-units --type=service --state=running - 基于 SysVinit 的系统:
service --status-all - 使用
ps命令:ps aux
3. 如何检查某个服务是否开机自启?
- systemd:
systemctl is-enabled <service-name> - SysVinit(基于 RHEL 的系统):
chkconfig --list <service-name>
4. 如何重启服务?
- 基于 systemd 的系统:
sudo systemctl restart <service-name> - 基于 SysVinit 的系统:
sudo service <service-name> restart
5. 如何停止或禁用服务?
- 临时停止某个服务:
sudo systemctl stop <service-name> - 禁止某个服务开机自启:
sudo systemctl disable <service-name>
6. 如何找出是哪个服务在占用某个端口?
你可以用 netstat 或 ss 来查找运行在特定端口上的服务:
netstat -tulnp | grep :80
或
ss -tulnp | grep :80
7. 如果找不到 systemctl 怎么办?
如果你遇到类似 command not found: systemctl 的错误,说明你的系统可能没有使用 systemd。可以试试:
service --status-all
或
ps aux | grep <service-name>
8. 如何列出失败的服务?
在基于 systemd 的系统上,运行:
systemctl list-units --type=service --state=failed
9. 如何查看某个服务的日志?
要查看由 systemd 管理的服务的日志,请使用:
journalctl -u <service-name>
要实时查看日志:
journalctl -u <service-name> -f
10. 我可以用 top 或 htop 查看运行中的服务吗?
可以!top 和 htop 都能实时查看正在运行的进程:
- 使用
top:top - 使用
htop(交互式,更易用):
(如果没有安装,可用htopsudo apt install htop或sudo yum install htop安装。)
