当前位置: 首页 > 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 适合简单后台任务。

相关文章:

  • 东芝新四款产品“TB67Z830SFTG、TB67Z830HFTG、TB67Z850SFTG、TB67Z850HFTG系列三相栅极驱动器ic三相栅极驱动器IC
  • 软件测试--入门
  • 【Linux】Ext系列文件系统
  • 鸿蒙-5.1.0-release构建编译环境
  • Oracle中的select1条、几条、指定范围的语句
  • 每日算法-250514
  • 【golang】网络数据包捕获库 gopacket
  • 嵌入式系统中WAV音频文件格式详解与处理实践
  • 【CustomPagination:基于Vue 3与Element Plus的高效二次封装分页器】
  • Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器
  • 安卓基础(Bitmap)
  • scons user 3.1.2
  • C#强类型枚举的入门理解
  • C++【STL】(2)string
  • 4级流程控制
  • 复现:DemoGen 用于数据高效视觉运动策略学习的 合成演示生成 (RSS) 2025
  • Docker 常见问题及其解决方案
  • nginx报错-[emerg] getpwnam(“nginx“) failed in /etc/nginx/nginx.conf:2
  • FastAPI + OpenAI 模型 的 GitHub 项目结构模板
  • 未来软件开发趋势与挑战
  • 观察|本轮印巴冲突或促使印度空军寻求更先进战机
  • 菲律宾中期选举初步结果出炉,杜特尔特家族多人赢得地方选举
  • 男子不满和睦家医院手术效果还遇到了“冒牌医生”?院方回应
  • 台行政机构网站删除“汉人”改为“其余人口”,国台办回应
  • 彭丽媛同巴西总统夫人罗桑热拉参观中国国家大剧院
  • 外媒:初步结果显示,菲律宾前总统杜特尔特当选达沃市市长