侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux disown命令教程:如何在后台运行程序并分离终端(附实例详解和注意事项)

Linux disown命令介绍

disown是一个shell内置命令,它的全称是disown jobs,意思是放弃对作业的所有权。作业是指在shell中运行的进程,通常是通过&符号在后台运行的。当你在终端中运行一个后台作业时,它仍然会受到终端的控制,如果你关闭终端或者网络断开,后台作业也会被终止。这时候,你可以使用disown命令来将后台作业从终端中分离出来,让它在后台继续运行,即使你退出终端或者网络断开,它也不会受到影响。disown命令可以让你在不使用screen或者nohup等工具的情况下,实现后台运行程序的功能。

Linux disown命令适用的Linux版本

disown命令是一个shell内置命令,它不需要安装任何额外的软件包。它主要适用于Bash和Zsh这两种常见的shell,其他的shell可能不支持或者有不同的用法。你可以通过echo $SHELL命令来查看你当前使用的shell类型。如果你想切换到Bash或者Zsh,你可以通过chsh -s /bin/bash或者chsh -s /bin/zsh命令来修改你的默认shell,然后重新登录终端。下面是在Bash和Zsh中使用disown命令的示例:

[linux@bashcommandnotfound.cn ~]$ sleep 1000 &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ disown
[linux@bashcommandnotfound.cn ~]$ exit
[linux@bashcommandnotfound.cn ~]% sleep 1000 &
[1] 1234
[linux@bashcommandnotfound.cn ~]% disown
[linux@bashcommandnotfound.cn ~]% exit

Linux disown命令的基本语法

disown命令的基本语法格式如下:

disown [-ar] [-h] [jobspec ...]

其中,方括号表示可选参数,省略号表示可以有多个参数。

Linux disown命令的常用选项或参数说明

disown命令的常用选项或参数说明如下表所示:

选项/参数说明
-a放弃对所有作业的所有权,相当于disown %1 %2 ...
-r放弃对所有正在运行的作业的所有权,相当于disown %1 %2 ...
-h不放弃对作业的所有权,只是将作业标记为不受挂起(SIGHUP)信号的影响,这样在终端关闭时,作业不会被终止
jobspec指定要放弃所有权的作业,可以是作业号(如%1)或者进程号(如1234),如果省略,则默认为最近的作业

Linux disown命令的实例

下面是一些使用disown命令的实例,你可以根据自己的需要来尝试运行它们。

实例1:在后台运行一个耗时的程序,并使用disown命令将其从终端中分离

[linux@bashcommandnotfound.cn ~]$ tar czvf backup.tar.gz /home &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ disown
[linux@bashcommandnotfound.cn ~]$ exit

这个实例中,我们使用tar命令来对/home目录进行压缩备份,并在后台运行。然后,我们使用disown命令来将这个作业从终端中分离,这样即使我们退出终端,这个作业也会在后台继续运行,直到完成。

实例2:在后台运行多个程序,并使用disown命令将其中一些从终端中分离

[linux@bashcommandnotfound.cn ~]$ sleep 1000 &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ sleep 2000 &
[2] 2345
[linux@bashcommandnotfound.cn ~]$ sleep 3000 &
[3] 3456
[linux@bashcommandnotfound.cn ~]$ disown %1 %3
[linux@bashcommandnotfound.cn ~]$ exit

这个实例中,我们在后台运行了三个sleep命令,分别让进程睡眠1000秒、2000秒和3000秒。然后,我们使用disown命令来将第一个和第三个作业从终端中分离,这样即使我们退出终端,这两个作业也会在后台继续运行,直到完成。而第二个作业仍然受到终端的控制,如果我们退出终端,它也会被终止。

实例3:在后台运行一个程序,并使用disown命令的-h选项来让其忽略挂起信号

[linux@bashcommandnotfound.cn ~]$ ping bashcommandnotfound.cn &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ disown -h
[linux@bashcommandnotfound.cn ~]$ exit

这个实例中,我们在后台运行了一个ping命令,用来测试bashcommandnotfound.cn的网络连通性。然后,我们使用disown命令的-h选项来让这个作业忽略挂起信号,这样在终端关闭时,这个作业不会被终止,而是继续运行。但是,这个作业仍然属于终端,如果我们重新登录终端,我们可以使用jobs命令来查看它的状态,或者使用fg命令来将它放到前台运行。

实例4:在后台运行一个程序,并使用disown命令的-a选项来放弃对所有作业的所有权

[linux@bashcommandnotfound.cn ~]$ sleep 1000 &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ sleep 2000 &
[2] 2345
[linux@bashcommandnotfound.cn ~]$ sleep 3000 &
[3] 3456
[linux@bashcommandnotfound.cn ~]$ disown -a
[linux@bashcommandnotfound.cn ~]$ exit

这个实例中,我们在后台运行了三个sleep命令,分别让进程睡眠1000秒、2000秒和3000秒。然后,我们使用disown命令的-a选项来放弃对所有作业的所有权,这样即使我们退出终端,这三个作业也会在后台继续运行,直到完成。

实例5:在后台运行一个程序,并使用disown命令的-r选项来放弃对所有正在运行的作业的所有权

[linux@bashcommandnotfound.cn ~]$ sleep 1000 &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ sleep 2000 &
[2] 2345
[linux@bashcommandnotfound.cn ~]$ sleep 3000 &
[3] 3456
[linux@bashcommandnotfound.cn ~]$ kill -STOP %2
[linux@bashcommandnotfound.cn ~]$ disown -r
[linux@bashcommandnotfound.cn ~]$ exit

这个实例中,我们在后台运行了三个sleep命令,分别让进程睡眠1000秒、2000秒和3000秒。然后,我们使用kill命令的-STOP选项来暂停第二个作业,让它处于停止状态。接着,我们使用disown命令的-r选项来放弃对所有正在运行的作业的所有权,这样即使我们退出终端,第一个和第三个作业也会在后台继续运行,直到完成。而第二个作业仍然属于终端,如果我们退出终端,它也会被终止。

实例6:在后台运行一个程序,并使用disown命令的-jobspec参数来指定要放弃所有权的作业

[linux@bashcommandnotfound.cn ~]$ sleep 1000 &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ sleep 2000 &
[2] 2345
[linux@bashcommandnotfound.cn ~]$ sleep 3000 &
[3] 3456
[linux@bashcommandnotfound.cn ~]$ disown 1234 3456
[linux@bashcommandnotfound.cn ~]$ exit

这个实例中,我们在后台运行了三个sleep命令,分别让进程睡眠1000秒、2000秒和3000秒。然后,我们使用disown命令的-jobspec参数来指定要放弃所有权的作业,这里我们使用进程号来指定,也可以使用作业号(如%1 %3)。这样即使我们退出终端,第一个和第三个作业也会在后台继续运行,直到完成。而第二个作业仍然受到终端的控制,如果我们退出终端,它也会被终止。

实例7:在后台运行一个程序,并使用disown命令的-h选项和-jobspec参数来让指定的作业忽略挂起信号

[linux@bashcommandnotfound.cn ~]$ ping bashcommandnotfound.cn &
[1] 1234
[linux@bashcommandnotfound.cn ~]$ ping www.dayxz.com &
[2] 2345
[linux@bashcommandnotfound.cn ~]$ disown -h %1
[linux@bashcommandnotfound.cn ~]$ exit

这个实例中,我们在后台运行了两个ping命令,分别用来测试bashcommandnotfound.cn和www.dayxz.com的网络连通性。然后,我们使用disown命令的-h选项和-jobspec参数来让第一个作业忽略挂起信号,这样在终端关闭时,这个作业不会被终止,而是继续运行。但是,这个作业仍然属于终端,如果我们重新登录终端,我们可以使用jobs命令来查看它的状态,或者使用fg命令来将它放到前台运行。而第二个作业仍然受到终端的控制,如果我们退出终端,它也会被终止。

Linux disown命令的注意事项

使用disown命令时,有以下几点需要注意:

  • disown命令只能对后台作业生效,对前台作业无效。如果你想对一个前台作业使用disown命令,你需要先按Ctrl+Z将它暂停,然后使用bg命令将它放到后台运行,再使用disown命令将它从终端中分离。
  • disown命令只能在当前终端中使用,对其他终端中的作业无效。如果你想对其他终端中的作业使用disown命令,你需要先切换到那个终端,然后使用disown命令将它从终端中分离。
  • disown命令只能在当前shell中使用,对其他shell中的作业无效。如果你想对其他shell中的作业使用disown命令,你需要先切换到那个shell,然后使用disown命令将它从终端中分离。
  • disown命令只能在Bash和Zsh中使用,其他的shell可能不支持或者有不同的用法。如果你想在其他的shell中使用disown命令,你需要先切换到Bash或者Zsh,然后使用disown命令将它从终端中分离。
  • disown命令只能放弃对作业的所有权,不能回收对作业的所有权。如果你想重新获得对作业的所有权,你需要使用ps命令来查找它的进程号,然后使用kill命令来终止它,或者使用reptyr命令来将它重新附加到终端。

如果你在使用disown命令时,遇到了bash: disown: command not found的错误提示,说明你的shell不支持这个命令,或者你没有正确地输入这个命令。你可以通过echo $SHELL命令来查看你当前使用的shell类型,如果不是Bash或者Zsh,你可以通过chsh -s /bin/bash或者chsh -s /bin/zsh命令来修改你的默认shell,然后重新登录终端。你也可以通过man disown或者help disown命令来查看这个命令的用法和选项。

0

评论区