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 或进程管理器。