nohup 干得好,断开连接时中止

nohup 干得好,断开连接时中止

我了解到,nohup如果您失去连接或需要注销,该命令允许命令继续运行。我通过 ssh 在远程程序中运行nohup nice my command &,在我的笔记本电脑失去网络连接后,终端显示“管道损坏”并自动退出。当我重新连接时,该作业丢失了。为什么会这样呢?是否可以从中断的地方运行它?

答案1

这里有几点需要理解:

  1. nohup不一定能防止程序失去连接。它的作用是屏蔽信号HUP,这是操作系统在您注销时发送给它的信号(实际上是控制 shell)。如果您的程序仍有连接到终端的文件描述符,它将被停止并可能被杀死。为了防止这种情况发生,nohup 通常将 stdout 和 stderr 重定向到nohup.outstdin 并关闭。但是,如果您的程序可能尝试打开终端的文件描述符。

  2. shell 不会跟踪调用/会话之间的“作业”。无法将作业重新附加到已退出的 shell。有几种解决方法:

    1. 使用终端仿真器,例如screen或 ,tmux它可以重新连接到不同的终端。在这里,您根本不需要在后台运行您的作业;只需在前台运行它并分离(Ctrl-A d使用screen)。

    2. 跟踪已启动作业的 PID。您可以jobs -l在启动后使用该命令获取此信息。当您希望新 shell 等待作业并且您知道作业的 pid 时,可以发出以下命令:

      wait <pid>
      

但输出仍将发送到nohup.out,并且您唯一的线索是它已完成,您会再次看到命令提示符。

相关内容