nohup 与 systemd 本质区别(原理拆解版)
本文件从 系统启动流程、进程托管机制、cgroup、日志系统 四个维度分析。
一、Linux 启动流程
内核启动后执行:
PID 1 进程
现代 Linux 发行版通常为:
systemd
验证:
bash
ps -p 1输出通常为 systemd。
二、nohup 的本质
nohup 只是一个用户级工具:
- 忽略 SIGHUP
- 不提供托管
- 不负责重启
- 不管理资源
结构:
shell └── python (忽略 SIGHUP)
如果 python 崩溃:
无人拉起。
三、systemd 的核心机制
systemd 是:
- PID 1
- 服务管理器
- cgroup 控制器
启动流程:
kernel ↓ systemd (PID 1) ↓ 读取 unit 文件 ↓ 按依赖顺序启动服务
四、进程托管原理
当定义:
[Service] ExecStart=/usr/bin/python BreakReminder.py Restart=always
systemd 会:
- fork 启动进程
- 监控子进程状态
- 监听 SIGCHLD
- 根据 Restart 策略决定是否重启
五、cgroup 管理
systemd 将每个服务放入独立 cgroup:
可实现:
- CPU 限制
- 内存限制
- IO 控制
- 进程数量限制
示例:
MemoryMax=200M CPUQuota=50%
nohup 无法实现资源隔离。
六、日志机制对比
nohup:
- 默认输出到 nohup.out
- 无结构化管理
systemd:
- 日志进入 journald
- 可用 journalctl 查询
- 支持按服务过滤
七、本质差异总结
维度 nohup systemd
层级 用户级 系统级 进程关系 shell 子进程 PID1 托管 重启机制 无 有 资源控制 无 有 生命周期 用户控制 系统控制
八、结论
nohup 解决:
"终端关闭后不退出"
systemd 解决:
"长期、稳定、可控、可监管运行"
两者层级完全不同。