最准确方法是执行 systemctl list-units --type=service --state=running,仅显示 ACTIVE=active 且 SUB=running 的真正运行中服务;单服务验证用 systemctl is-active service_name。

要查看 Linux 系统中所有已启动(即当前正在运行)的服务,最准确、最直接的方法是使用 systemctl 命令配合 --state=running 选项。这反映的是真正处于活动运行状态的 systemd 服务进程,不是“设为开机自启”或“已加载但未启动”的服务。
注意:已启动 ≠ 已启用。比如 docker.service 可能被设为 enabled(开机自启),但若你没手动 start 过,它就不会出现在 running 列表里。
查看所有正在运行的服务(推荐)
执行以下命令:
systemctl list-units --type=service --state=running
- 输出包含服务名(UNIT)、加载状态(LOAD)、活动状态(ACTIVE)、子状态(SUB)和描述(DESCRIPTION)
-
ACTIVE列为active,SUB列为running,才表示该服务进程确实在后台持续运行
如需更简洁输出(只显示服务名),可加管道过滤:
systemctl list-units --type=service --state=running --no-pager --quiet | awk '{print $1}'补充方式:查看所有已加载且活跃的服务(含已启动但可能刚退出的)
有些服务是“一次性”或“成功退出后不再运行”的(如 logrotate.service),它们在 running 中不出现,但在 active 状态下仍算作“已启动过”。此时可用:
systemctl list-units --type=service --state=active
-
active包括running、exited(正常退出)、waiting等子状态 - 更全面地反映“系统曾拉起并执行过”的服务
验证单个服务是否在运行
对某个具体服务,用 is-active 最快:
systemctl is-active nginx.service
返回 active 表示正在运行;返回 inactive 表示没启动(不等于故障);返回 failed 才需排查。
注意事项
- 如果系统用的是老式 SysVinit(如 CentOS 6 或极简嵌入式系统),
service --status-all仍可用,但输出格式较粗糙,且无法区分“进程存活”和“服务真正就绪” -
ps aux | grep -v grep | grep 'bin/'类方法属于底层进程视角,容易漏判(比如服务用 Python 启动但进程名不体现服务名)或误判(把非服务进程当服务) -
ss -tlnp或netstat -tulpn可辅助验证网络服务是否真在监听端口,但仅适用于对外提供网络能力的服务
不复杂但容易忽略。


















