应优先使用 systemctl list-units --type=service --state=running 查看 systemd 管理的活跃守护服务,辅以 ps -eo pid,ppid,sid,tty,comm,args 结合 PPID=1 和 TTY=? 等特征筛选传统守护进程。

在 Linux 系统中,守护进程(daemon)是后台运行、不与用户终端直接交互的长期服务进程。要列出所有正在运行的守护进程,关键不是简单“找后台进程”,而是识别那些符合守护进程特征(如无控制终端、会话组长、独立于登录会话)且当前活跃的服务。以下方法兼顾准确性与实用性:
用 systemctl 查看 systemd 管理的守护服务(推荐)
现代大多数 Linux 发行版使用 systemd 作为初始化系统,绝大多数守护进程以 systemd service 单元形式管理:
-
列出所有已加载且处于激活状态的服务:
systemctl list-units --type=service --state=running -
区分真正“长期运行”的守护服务(排除一次性或已退出的服务):
systemctl list-units --type=service --state=running --all | grep "active (running)" -
过滤掉 socket、timer 等非进程类单元,只看实际运行中的服务进程:
systemctl list-units --type=service --state=running --plain
注意:该命令显示的是 systemd 认为“正在运行”的服务,不等于每个都对应一个持续存活的进程(例如某些服务启动后执行任务即退出),但覆盖了绝大多数典型守护进程(如 sshd、nginx、cron、dbus 等)。
用 ps 结合特征筛选传统守护进程
守护进程通常具备一些共性:PPID 为 1(被 init/systemd 托管)、无控制终端(TTY 列显示为 ?)、会话 ID(SID)与其 PID 相同(表明是会话首进程)。可组合使用:
-
基础筛选(常见有效):
ps -eo pid,ppid,sid,tty,comm,args --sort=-pid | awk '$2==1 && $4=="?" {print}'
——选出父进程为 1 且无 TTY 的进程,再人工核对是否为服务进程(如 rsyslogd、ntpd) -
更严格匹配(需 root 权限):
sudo ps -eo pid,sid,comm,cmd --forest | awk '$2==$1 && $3 !~ /^(bash|sh|zsh|login|sshd)$/ {print}'
——筛选 SID == PID(会话首进程),并排除常见交互式 shell 进程
提示:ps 输出中 ? 表示无控制终端,是守护进程的重要标志;但部分普通后台作业(如 nohup ./script.sh &)也可能满足,需结合进程名和用途判断。
补充:查看 /proc 下的进程属性(进阶验证)
若需确认某个进程是否真正符合守护进程定义,可检查其 /proc/PID/status:
- 查看 PPid: 是否为 1
- 查看 Tgid: 和 Pid: 是否一致(表示主线程)
- 检查 CapBnd: 或 Groups: 可辅助判断权限模型(非必需)
- 运行
ls -l /proc/PID/fd/,典型守护进程通常不持有终端设备文件(如 /dev/tty)
不建议依赖的方法
以下方式容易误判或遗漏:
-
jobs或fg/bg——仅显示当前 shell 会话的作业,与守护进程无关 -
top或htop默认视图 ——展示所有进程,无法自动区分守护进程,需手动识别 - 仅靠
ps aux | grep "d$"——很多守护进程名不以 d 结尾(如 cron、rsyslog、polkitd 是例外,但 polkitd 是特例),且可能匹配到无关进程(如 “debug”、“added”)
真正可靠的入口始终是 systemd 的服务状态,辅以 ps 的进程属性分析。日常运维优先用 systemctl;排查兼容性问题或非 systemd 系统(如旧版 SysVinit)时,再结合 ps 和 /proc 深入验证。

















