linux后台进程管理分两类:临时任务用shell作业控制(&、ctrl+z、jobs、fg/bg),持久服务需nohup/disown/setsid或systemd守护;后者须满足fork-setsid-目录重设-信号处理等标准,并推荐用systemd统一管控。

Linux中管理后台进程和实现进程守护,核心在于区分两类场景:临时性后台任务(用户会话内运行)和长期稳定服务(系统级守护进程)。前者重在调度与隔离,后者重在独立性与健壮性。
快速启动与切换前台/后台任务
日常操作中最常用的是 shell 作业控制机制:
- 命令末尾加 &:直接以后台方式启动,如
python3 server.py & - Ctrl+Z 暂停当前前台任务,再用
bg让其继续在后台运行 -
jobs查看当前会话中所有作业(含暂停和运行中的),显示编号如[1]+ Running -
fg %1或bg %2按作业号切换状态,不依赖 PID
确保退出终端后进程仍存活
普通 & 启动的进程在关闭终端时会被发送 SIGHUP 信号终止。要避免这点,需主动屏蔽挂断信号:
-
nohup command > out.log 2>&1 &:忽略 HUP,同时重定向标准输出和错误到文件 -
disown %1:对已启动但未加 nohup 的作业补救,将其从当前 shell 作业表中移除 -
setsid command:在新会话中运行,彻底脱离原终端控制关系
构建真正意义上的守护进程
系统服务类进程不能只靠 nohup,必须满足守护进程标准模型:
- 调用
fork()创建子进程后,父进程立即退出,使子进程成为孤儿,由 init(或 systemd)接管 - 子进程调用
setsid()创建新会话,脱离控制终端和进程组 - 更改工作目录至
/,防止占用可卸载文件系统 - 重设 umask,关闭继承的文件描述符(0/1/2),避免资源泄露
- 注册信号处理器(如捕获 SIGTERM),支持优雅退出
使用现代服务管理工具统一管控
手动编写守护进程复杂易错,推荐通过 systemd 等系统级服务管理器部署:
- 编写 unit 文件(如
/etc/systemd/system/myapp.service),定义启动方式、重启策略、日志行为 - 启用并启动:
systemctl daemon-reload && systemctl enable --now myapp - 查看状态:
systemctl status myapp;查看日志:journalctl -u myapp -f - 自动处理崩溃重启、依赖顺序、资源限制等,比裸进程更可靠