当前位置: 首页 > news >正文

【Linux】掌握 setsid:让进程脱离终端独立运行

setsid 是一个在 Linux 和 Unix 系统中运行的命令,用于启动一个新的会话(session),并将指定的程序在这个新会话中运行。它的主要作用是让进程脱离当前终端(terminal)的控制,成为独立的守护进程(daemon)。


基本语法

setsid [options] command [arguments]

核心功能

  1. 创建新会话

    • 调用进程会成为新会话的领导者(session leader),并脱离原终端的控制。
    • 新会话没有关联的控制终端(即使程序尝试打开终端也会失败)。
  2. 脱离终端依赖

    • 即使父进程(如终端)退出,通过 setsid 启动的进程仍会继续运行。
  3. 避免进程被信号干扰

    • 例如,终端关闭时发送的 SIGHUP 信号不会影响 setsid 启动的进程。

常见用途

  1. 启动守护进程
    让程序在后台运行,不受终端关闭的影响:

    setsid your_command &
    
  2. 避免终端退出时进程被终止
    比如运行一个长时间任务:

    setsid ./long_running_script.sh
    
  3. 结合 nohup 使用
    双重保障(脱离终端 + 忽略 SIGHUP):

    setsid nohup your_command &
    

常用选项

选项说明
-c, --ctty设置新会话的控制终端(需特权,极少使用)
-w, --wait等待子进程结束,并返回其退出状态
-V, --version显示版本信息
-h, --help显示帮助文档

示例

  1. 启动一个后台服务并脱离终端:

    setsid /usr/local/bin/my_service
    
  2. 运行脚本并忽略终端信号:

    setsid ./script.sh > /dev/null 2>&1
    
  3. 结合 nohup 和重定向:

    setsid nohup python3 server.py > output.log 2>&1 &
    

与类似命令对比

命令作用
nohup忽略 SIGHUP 信号,但进程仍属于原会话(需配合 & 实现后台运行)。
disown将已运行的作业从 shell 的作业表中移除,避免终端退出时收到 SIGHUP
tmux/screen通过虚拟终端管理会话,功能更强大,适合交互式任务。

注意事项

  • setsid 不能直接用于已经运行的进程。若需将现有进程移到新会话,可使用 reptyr 等工具。
  • 如果命令本身会自行守护进程(如 nginxsshd),则无需额外使用 setsid

通过 setsid,你可以轻松实现进程的“后台持久化”,特别适合需要长期运行的服务或任务。


忽略 SIGHUP 是什么意思?

SIGHUP(Signal Hang Up)是 Linux/Unix 系统中的一种信号(Signal),默认行为是终止进程。当终端(Terminal)关闭或父进程退出时,系统会向该终端关联的所有进程发送 SIGHUP 信号,导致这些进程被终止。


1. 什么情况下会收到 SIGHUP?

  • 关闭终端窗口(SSH 断开、本地终端退出)。
  • 父进程退出(如 shell 退出)。
  • 手动发送 SIGHUPkill -HUP <PID>)。

2. 如何让进程忽略 SIGHUP?

方法 1:使用 nohup

nohup(No Hang Up)命令可以让进程忽略 SIGHUP 信号:

nohup your_command &
  • 输出默认重定向到 nohup.out
  • 进程不会因终端关闭而终止。

方法 2:使用 setsid

setsid 让进程运行在新的会话(Session),不受原终端影响:

setsid your_command
  • 进程完全脱离终端,不会收到 SIGHUP

方法 3:使用 disown

如果进程已经在运行,可以用 disown 让它脱离 shell 控制:

./your_command &
disown -h %1  # 让作业 1 忽略 SIGHUP

方法 4:使用 trap(在脚本内部)

在脚本中捕获并忽略 SIGHUP

#!/bin/bash
trap '' HUP  # 忽略 SIGHUP
your_command

3. 对比不同方法

方法作用机制适用场景
nohup忽略 SIGHUP简单后台任务
setsid创建新会话,脱离终端长期守护进程
disown从 shell 作业表移除已运行的进程
trap脚本内部处理信号自定义信号处理

4. 示例

(1)用 nohup 运行 Python 脚本

nohup python3 server.py > server.log 2>&1 &
  • 即使终端关闭,server.py 仍会运行,日志写入 server.log

(2)用 setsid 启动守护进程

setsid /usr/local/bin/my_daemon
  • my_daemon 完全脱离终端,不会因 SIGHUP 终止。

(3)用 disown 保护已运行进程

./long_task.sh &  # 后台运行
disown -h %1      # 忽略 SIGHUP
  • 即使终端退出,long_task.sh 也不会被终止。

5. 总结

  • SIGHUP 是终端关闭时发送的信号,默认会终止进程。
  • nohupsetsiddisowntrap 都可以让进程忽略 SIGHUP
  • setsid 最彻底,适合守护进程;nohup 适合简单后台任务。
http://www.xdnf.cn/news/447589.html

相关文章:

  • 三种映射方式总结
  • 第二十九节:直方图处理-直方图均衡化
  • ET ProcessInnerSender类(实体) 分析
  • ultralytics中tasks.py---parse_model函数解析
  • 求助求助,重金酬谢
  • Java知识框架
  • AIGC与数字媒体实验室解决方案分享
  • Jmeter对服务端进行压测快速上手
  • 【电路笔记 通信】8B/10B编码 高速数据传输的串行数据编码技术 论文第三部分 The 8B/10B coding map
  • HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
  • OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(
  • Flutter 开发入门:从一个简单的计数器应用开始
  • 操作系统-物理结构
  • 【拥抱AI】Deer-Flow字节跳动开源的多智能体深度研究框架
  • MCP:开启AI的“万物互联”时代
  • 网站安全防御
  • 北斗导航 | 接收机自主完好性监测算法综述,1980至2025年(原理,公式,代码)
  • Java版OA管理系统源码 手机版OA系统源码
  • 深入理解卷积神经网络:从基础原理到实战应用
  • 硕士论文用YOLO可以毕业吗?
  • 记录算法笔记(20025.5.14)对称二叉树
  • 码题集——魔数、A的B次方、网球比赛、三角形、点与线段的关系
  • libmemcached库api接口讲解五
  • Java Queue 接口实现
  • 【经验分享】Dify+GraphRAG实现知识图谱智能问答
  • QMK键盘编码器(Encoder)(理论部分)
  • Unity Image组件无法阻挡手势的解决办法
  • 如何在运行不同操作系统的计算机上轻松擦除U盘
  • 【行为型之观察者模式】游戏开发实战——Unity事件驱动架构的核心实现策略
  • 医学影像系统的集成与工作流优化