目录

Linux 后台启动命令setsid和nohup的区别介绍

setsidnohup 都是 Linux/Unix 下常用的“后台启动命令”,但它们的原理、作用范围和适用场景是不同的。下面系统梳理一下对比。

🧩 一、nohup:防止进程收到挂断信号(SIGHUP)

✅ 基本作用

nohup 的全称是 “no hang up”,它的作用是:

当用户退出终端(例如关闭 SSH 或关闭终端窗口)时,不让进程收到 SIGHUP(挂起信号),从而避免被系统终止。

✅ 使用方式

1
nohup python3 app.py > app.log 2>&1 &

说明:

  • 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)。

换句话说,它让进程彻底与当前终端分离,不再属于当前用户会话。

✅ 使用方式

1
setsid python3 app.py > app.log 2>&1 &

✅ 常见特点

特点 说明
会话关系 创建新的会话和进程组,不再属于当前终端
信号影响 完全独立于原终端,不仅忽略 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 来托管进程

⚙️ 五、补充:可结合使用

其实也可以 组合 使用:

1
nohup setsid ./app > app.log 2>&1 &

这样既避免挂起信号,又彻底脱离控制终端,是最稳妥的后台方式之一(尤其在嵌入式或无人值守设备上)。