没有统一的“所有后台进程”概念:jobs仅显示当前终端的后台作业(含编号、状态、命令),ps则按tty和stat字段反映系统级进程的后台特征。

没有“所有后台进程”这个统一概念,得看你想查哪一类——当前终端的、系统全局的、还是服务类的,用的命令和结果含义完全不同。
jobs 只显示当前终端的后台作业,关掉终端就没了
它只管你在当前 bash/zsh 里用 & 启动或 Ctrl+Z 暂停后用 bg 放到后台的任务,不跨会话、不跨终端:
-
jobs列出任务编号(%1、%2)、状态(Running/Stopped)和命令 -
jobs -l多显示一列 PID,方便后续用kill %1或kill 1234 - 一旦你退出这个终端,这些任务默认会被 SIGHUP 终止(除非用了
nohup或disown) - 它看不到其他用户开的终端里的任务,也看不到系统服务(比如
sshd、nginx)
ps aux 和 ps -ef 查的是系统级进程,但“后台”不是它的分类维度
ps 不区分“前台/后台”,它只按进程状态(STAT 字段)和是否关联终端(TTY 字段)来呈现。真正能反映“后台行为”的线索是:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
ps aux:重点关注TTY列为?的进程(无控制终端),以及STAT为S(休眠)、I(空闲)或(高优先级)的进程;<code>%CPU和%MEM偏高的也大概率是长期运行的后台服务 -
ps -ef:更关键的是看PPID(父进程 ID),比如很多守护进程的 PPID 是 1(init/systemd),说明它们脱离了用户会话 - 别信
ps aux | grep "defunct"—— 那是僵尸进程,不是你想要的“后台任务”
systemctl list-units --type=service 看的是 systemd 管理的服务型后台进程
现代 Linux 发行版中,大部分长期运行的后台程序(数据库、Web 服务器、定时任务等)都由 systemd 托管:
-
systemctl list-units --type=service --state=running列出所有正在运行的服务 -
systemctl status nginx能看到它是否 active、PID、启动时间、日志片段 - 注意:这不会显示你用
python script.py &这种方式手动起的普通进程,除非你把它写成 service unit 文件并启用
容易忽略的关键点:终端生命周期和信号处理
很多人以为 command & 就是“后台进程”,其实它只是被 shell 放入后台执行,仍绑定当前终端。真正让进程脱离终端持续运行,必须显式处理 SIGHUP:
- 用
nohup command &:忽略挂起信号,输出重定向到nohup.out - 用
disown %1:从当前 shell 作业表中移除任务,断开与终端的关联 - 用
screen或tmux:创建独立会话,关闭终端也不影响里面跑的进程 - 直接用
setsid command:让进程在新的会话中启动,完全脱离原终端
不处理这点,哪怕你用 ps 看到了 PID,关掉终端后进程也会消失——这不是命令没查到,而是它本来就没活那么久。










