Linux 后台启动命令setsid和nohup的区别介绍
目录
setsid 和 nohup 都是 Linux/Unix 下常用的“后台启动命令”,但它们的原理、作用范围和适用场景是不同的。下面系统梳理一下对比。
🧩 一、nohup:防止进程收到挂断信号(SIGHUP)
✅ 基本作用
nohup 的全称是 “no hang up”,它的作用是:
当用户退出终端(例如关闭 SSH 或关闭终端窗口)时,不让进程收到
SIGHUP(挂起信号),从而避免被系统终止。
✅ 使用方式
|
|
说明:
nohup:防止退出终端后程序退出;> app.log 2>&1:将标准输出和标准错误都重定向到app.log;&:让命令在后台运行。
✅ 常见特点
| 特点 | 说明 |
|---|---|
| 信号保护 | 忽略 SIGHUP,终端关闭程序仍运行 |
| 会话关系 | 进程仍属于当前 会话(session) |
| 输出 | 默认输出到 nohup.out(除非重定向) |
| 常见用途 | 启动后台任务(如脚本、守护进程) |
| 可移植性 | 适用于所有类 Unix 系统(Linux、macOS、BSD 等) |
🧩 二、setsid:创建新的会话(Session Leader)
✅ 基本作用
setsid 的全称是 “set session id”。
它的作用是:
创建一个新的 会话(session)、进程组(process group),并脱离原控制终端(controlling terminal)。
换句话说,它让进程彻底与当前终端分离,不再属于当前用户会话。
✅ 使用方式
|
|
✅ 常见特点
| 特点 | 说明 |
|---|---|
| 会话关系 | 创建新的会话和进程组,不再属于当前终端 |
| 信号影响 | 完全独立于原终端,不仅忽略 SIGHUP,连控制终端断开也无影响 |
| 输出 | 不会自动重定向输出,若不加重定向会打印到控制台 |
| 常见用途 | 守护进程(daemon)启动,更彻底的后台方式 |
| 可移植性 | 适用于 Linux、FreeBSD、macOS、Android(多数 Unix-like) |
🆚 三、nohup 与 setsid 的区别总结表
| 对比项 | nohup |
setsid |
|---|---|---|
| 主要目的 | 防止挂起(忽略 SIGHUP) | 创建新的会话,彻底脱离终端 |
| 是否创建新会话 | 否 | 是 |
| 是否忽略 SIGHUP | 是 | 间接是(因为无终端) |
| 是否需要重定向输出 | 建议重定向,否则写到 nohup.out | 必须重定向,否则仍打印到控制台 |
| 是否属于同一会话 | 是(原会话) | 否(新会话) |
| 常用场景 | 启动长期运行任务、测试脚本 | 启动后台守护服务、生产部署 |
| 是否适用于所有 Linux/Unix | ✅ 是 | ✅ 是(但某些老系统需单独安装 coreutils) |
🧠 四、实际使用建议
| 需求 | 推荐命令 |
|---|---|
| 临时后台运行、关闭 SSH 不想中断 | nohup ./app & |
| 启动长期后台服务或守护程序 | setsid ./app > log.txt 2>&1 & |
| 想彻底脱离控制终端并不写日志 | setsid ./app >/dev/null 2>&1 < /dev/null & |
| 结合 systemd、supervisord 管理 | 更推荐使用 systemd 或 supervisord 来托管进程 |
⚙️ 五、补充:可结合使用
其实也可以 组合 使用:
|
|
这样既避免挂起信号,又彻底脱离控制终端,是最稳妥的后台方式之一(尤其在嵌入式或无人值守设备上)。