disown
是 Linux 中用于将当前 Shell 会话中的后台作业与终端解绑的命令。通过disown [作业编号]
可将指定任务移出作业列表,使其在终端关闭后仍持续运行,避免因 Shell 退出而被终止。常用disown -h
仅阻止 Shell 发送 SIGHUP 信号,但保留作业记录。需先通过jobs
查看作业编号,配合&
或Ctrl+Z
+bg
将任务放入后台,再执行disown
。适用于需要长时间运行且脱离终端管理的进程。
在Linux系统中,进程管理是开发者与运维人员的必修课,当我们需要在后台运行耗时任务时,通常会使用&
符号或nohup
命令,但有一个常被忽视的关键命令——disown,它能为进程管理提供更精细的控制。
disown
属于Bash内置命令,专为作业控制(Job Control)设计,与简单地将进程放到后台不同,它的核心作用是解除Shell与子进程的关联关系,当终端会话关闭时,被disown的进程不会被发送SIGHUP
信号,从而避免被意外终止。
经典使用场景 $ long_running_task & $ jobs -l # 查看后台作业 $ disown %1 # 解除第一个作业与Shell的关联
1、指定作业解除
disown %n
精准解除指定编号的作业关联,适用于多任务管理场景
2、保留作业但解除关联
disown -h %n
将作业保留在作业表中但脱离信号关联,方便后续管理
3、批量解除所有作业
disown -a
一次性解除全部后台作业,适用于清理作业环境
工具 | 信号处理 | 输出重定向 | 使用场景 |
nohup | 启动时忽略SIGHUP | 自动创建nohup.out | 新启动进程时使用 |
disown | 解除已有进程关联 | 需手动配置 | 管理已存在的后台进程 |
实验验证:
终端A $ sleep 3600 & $ disown %1 终端B $ pstree -ps <sleep_PID> # 可见其父进程已变为init/systemd
1、输出重定向必做
脱离Shell控制的进程需提前处理标准流:
command > output.log 2>&1 & disown
2、配合screen/tmux
复杂任务建议使用终端复用器:
$ screen -S task_session $ make all Ctrl+a d # 安全脱离会话
3、系统级守护进程选择
对于关键服务,建议使用systemd等专业工具:
[Unit] Description=My Service [Service] ExecStart=/path/to/service
未重定向输出的进程可能占满磁盘
脱离监控的进程可能成为僵尸进程
数据库类应用需谨慎处理事务连接
引用说明
[1] GNU Bash Manual Job Control Builtins
[2] Linux Programmer’s Manual SIGNAL(7)
[3] StackExchange Unix论坛进程管理专题