首页/系统/Linux 运维命令速查/disown 让后台作业脱离会话
进程与作业69 条

disown 让后台作业脱离会话

把作业从 shell 作业表移除:之后退出终端不向它发 SIGHUP,弥补「忘了 nohup 就跑了长任务」。

Linux 运维命令速查系统更新于 2026-10-13

disown 解决什么

disown 是 bash、zsh 的内建命令,把指定作业从当前 shell 的作业表里移除。移除之后,shell 退出时不会再向它发送 SIGHUP,进程因此能在断开终端后继续运行。典型场景是包管理器更新、长编译或数据同步任务已经用 & 放到后台,才想起没加 nohup,此时用 disown 补救最省事。

基本信息

适用平台bash、zsh 等支持作业控制的交互式 shell
语法disown [-h | -a] [%作业号]
常用形式无参数处理当前作业;-a 处理全部作业;-h 只忽略 SIGHUP 但保留作业表
前提条件作业控制必须开启,脚本等非交互场景通常不可用

典型使用场景

  • 长任务已经后台运行才发现没加 nohup,用 disown 补救
  • 临时同步大文件时不想一直挂着 SSH 会话
  • 作业表中挂了一堆无关任务,用 -a 一次性全部脱离
  • 只想让它忽略挂断信号、但仍想在 jobs 里看到它:用 -h
  • 配合重定向把输出落盘,随后安心退出终端

常用示例

常用示例
long_task > /var/log/long_task.log 2>&1 &   # 后台运行并先把输出重定向
jobs -l                                      # 确认作业号与 PID
disown %1                                    # 指定作业脱离会话
disown -a                                    # 所有作业一起脱离
disown -h                                    # 只忽略 SIGHUP,作业表仍保留记录
jobs                                         # 脱离后该作业不再出现在列表
ps -o pid,ppid,stat,cmd -p $(pgrep -f long_task)   # 核对进程是否仍在

几种保活方式对照

方式使用时机特点
nohup cmd &启动之前忽略 SIGHUP 并把输出重定向到文件,最常用
disown已经启动之后补救手段,不改变已有输出重定向
setsid cmd启动之前另开会话,脱离控制终端更彻底
screen / tmux需要交互或回看输出可重连会话,适合需要观察过程的场景
systemd 服务长期运行的生产进程有守护、日志与开机自启,最正规
disown 只影响信号投递与作业表,不会把进程的输出从终端上摘下来。已经指向终端的 stdout 在会话断开后写入会出问题,正确顺序是先重定向再 disown。
脱离终端不等于长期可靠:它不受任何守护进程管理,进程崩溃不会被拉起,机器重启也一切归零。生产任务应交给 systemd 或进程管理器。

易错点

  • 顺序反了:先跑任务再 disown,输出仍指向终端,断开后写日志可能失败或丢失
  • disown 只覆盖 SIGHUP 相关行为,进程自身崩溃、被 OOM 杀掉都不会有人管
  • 在脚本等非交互场景里 disown 不可用,此时应改用 setsid 或 nohup
  • disown 后 jobs 里看不到,容易误以为任务已停止,核对状态要用 ps 或日志

数据来源与参考

  • man 1 bash(JOB CONTROL 章节)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌