我了解到,nohup
如果您失去连接或需要注销,该命令允许命令继续运行。我通过 ssh 在远程程序中运行nohup nice my command &
,在我的笔记本电脑失去网络连接后,终端显示“管道损坏”并自动退出。当我重新连接时,该作业丢失了。为什么会这样呢?是否可以从中断的地方运行它?
答案1
这里有几点需要理解:
nohup
不一定能防止程序失去连接。它的作用是屏蔽信号HUP
,这是操作系统在您注销时发送给它的信号(实际上是控制 shell)。如果您的程序仍有连接到终端的文件描述符,它将被停止并可能被杀死。为了防止这种情况发生,nohup 通常将 stdout 和 stderr 重定向到nohup.out
stdin 并关闭。但是,如果您的程序可能尝试打开终端的文件描述符。shell 不会跟踪调用/会话之间的“作业”。无法将作业重新附加到已退出的 shell。有几种解决方法:
使用终端仿真器,例如
screen
或 ,tmux
它可以重新连接到不同的终端。在这里,您根本不需要在后台运行您的作业;只需在前台运行它并分离(Ctrl-A d
使用screen
)。跟踪已启动作业的 PID。您可以
jobs -l
在启动后使用该命令获取此信息。当您希望新 shell 等待作业并且您知道作业的 pid 时,可以发出以下命令:wait <pid>
但输出仍将发送到nohup.out
,并且您唯一的线索是它已完成,您会再次看到命令提示符。