断开连接后是否需要断开某个进程才能继续运行?

断开连接后是否需要断开某个进程才能继续运行?

disown如果您希望在断开连接后仍保持作业运行,有人会解释是否有必要以及为什么有必要吗?

我问这个问题是因为我访问过的每个网站都说要使用disownandbgbg它本身对我有用,我不知道为什么。

是因为我还没有完全理解它的disown用途,还是有一些设置影响了bg命令的默认行为?

这就是我所做的:

  • 通过 SSH 连接到我的 CentOS 6 机器
  • 创建了一个简单的流程:

    tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
    
  • 暂停了工作

  • 通过在后台恢复它bg 1
  • 与 SSH 服务器断开连接

然后我通过 FTP 检查该.tar.gz文件的大小是否仍在增长,事实确实如此。

答案1

通过后台运行的进程bg通常&会在以下两种情况下死亡:

  1. shell 收到 SIGHUP
  2. 他们尝试写入不再存在的终端。

项目 #1 是关闭终端时的罪魁祸首。然而它是否发生取决于如何你关闭你的终端。您可以通过以下方式关闭它:

  1. 比如在窗口管理器中单击“X”
  2. 您可以键入exitlogoutCTRL+ D

第 #1 项将导致发送 SIGHUP。 #2 没有。

长话短说,如果您使用 后台进程,然后使用、或+bg注销,该进程将不会被终止。exitlogoutCTRLD

答案2

当您关闭终端时,使用该终端的所有进程(请参阅输出TTY中的列ps -elf)都会收到一个SIGHUP.这取决于进程要做什么SIGHUP。在经典的 UNIX(AIX、Solaris)中,进程在此信号上关闭。这就是为什么你需要使用disown.从man bash

默认情况下,shell 在收到 SIGHUP 后退出。在退出之前,交互式 shell 会向所有正在运行或已停止的作业重新发送 SIGHUP。停止的作业将被发送 SIGCONT 以确保它们收到 SIGHUP。为了防止 shell 向特定作业发送信号,应该使用 disown 内置命令将其从作业表中删除(请参阅下面的 SHELL BUILTIN 命令),或者使用 disown -h 将其标记为不接收 SIGHUP。

相关内容