Skip to content

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 会:

  1. fork 启动进程
  2. 监控子进程状态
  3. 监听 SIGCHLD
  4. 根据 Restart 策略决定是否重启

五、cgroup 管理

systemd 将每个服务放入独立 cgroup:

可实现:

  • CPU 限制
  • 内存限制
  • IO 控制
  • 进程数量限制

示例:

MemoryMax=200M CPUQuota=50%

nohup 无法实现资源隔离。


六、日志机制对比

nohup:

  • 默认输出到 nohup.out
  • 无结构化管理

systemd:

  • 日志进入 journald
  • 可用 journalctl 查询
  • 支持按服务过滤

七、本质差异总结

维度 nohup systemd


层级 用户级 系统级 进程关系 shell 子进程 PID1 托管 重启机制 无 有 资源控制 无 有 生命周期 用户控制 系统控制


八、结论

nohup 解决:

"终端关闭后不退出"

systemd 解决:

"长期、稳定、可控、可监管运行"

两者层级完全不同。

Released under the MIT License.