恢复运行在丢弃的SSH会话中的命令

读这个问题让我想知道。 假设screen没有被使用。 如果Linux目标上的SSH会话因任何原因被丢弃,并且在服务器由于超时而终止会话之前重新连接,是否有可能重新获得对运行命令的控制权,使得不会由于会话中断而中止?

尝试将新terminal的当前STD *文件描述符连接到旧的正在运行的进程只是要求麻烦。 即使你设法做到这一点,terminal的工作控制也不会如预期的那样工作。 如果你最终退出接pipe程序,你将会留下一团糟,而那些牺牲它的文件描述符以交给新后台进程的shell会发生什么情况。 当shell离开时,ssh会保持打开状态吗? 可能不会。 所以你需要先把它redirect到别的地方。

可能与否,我敢打赌,让被遗弃的程序“自然地”被杀害是更可取的。 如果你做了足够重要的事情来certificate你想要恢复控制所需的所有骇客, 你又处在一个不稳定的环节,那么你应该事先知道,只要使用screen(或者vnc,控制船)。 🙂

通常,处理这个问题的正确方法是提前做好准备,使用GNU screen或bash的nohupdisown机制。 如果您使用的是tcsh ,那么当shellexception退出时,shell将会拒绝后台作业。

如果你不使用screen但已经设法通过其中一种disown方法来保持你的进程运行,你可能会用gdb ( source )伪造重新连接到进程:

有一些肮脏的黑客,重新打开一个进程的stdout / stderr / stdin不是不可能的。 […]

然后用gdb来附加进程,做一些调用close(0)
致电closures(1)
致电closures(2)
调用open(“/ dev / pts / xx”,…)
调用dup(0)
调用dup(0)
分离

现在,你必须根据你的情况调整这个过程。 如果你没有设法否认这个过程,我怀疑这会有所帮助。 如果您使用的是bash , 请参阅这篇文章 ,让bash在退出时自动忽略后台进程(基本上,使用shoptclosureshuponexit )。 在前台进程中,你需要使用nohup

我知道这是一个古老的问题,但是我觉得添加我的发现非常重要,以防其他人像我一样碰到这个问题。

我没有看到这样做有任何不寻常的后果,但这是我使用的,它的工作令人惊讶。 有时候,当我们在服务器上运行很长的进程时,它有时会断开ssh会话。 tty会话过程似乎保持运行,但我们不能重新连接到它。 我发现下面的程序将进程拉到新连接的会话。

https://github.com/nelhage/reptyr

这里有更多的信息

https://blog.nelhage.com/2011/02/changing-ctty/

可能不会。 我不能保证这是不可能的,但我真的怀疑它。

有一件事是没有杀死shell和由于ssh连接终止而运行的可能的命令。 这不是那么难,你应该能够使用nohup和类似的机制,如在其他问题中提到的。

但是,假设你启动了ssh somehost nuhup vim /some/file ,连接ssh somehost nuhup vim /some/file了。 你运行ssh somehost重新login,可以看到你的vim进程仍在运行。 但是,如何再次连接到这个过程呢? 交互式的forground进程有一个控制的tty ,当它启动的时候,你的vim进程会被打开。 我不确定是否有任何方法在新的shell中重新打开它(就像在一个shell中运行多个后台作业一样,您不能在另一个shell中前台运行)。

Screen已被明确写入具有此function。 在启动时,它会分叉两个进程,一个terminalpipe理进程和一个客户进程。 交互是客户端 – terminalpipe理器应用程序,当你断开或失去连接时,客户端进程就会死亡,而terminalpipe理器继续运行。 屏幕有一些具体的支持,以后再次附加到terminalpipe理过程,我不认为这是可能的一般情况下。

retty可能会帮助你,但免责声明是非常真实和相关:)

如果会议被拒绝,这意味着TTL已经过期,所以没有更多的Tty(据我了解)。 但是,如果您的networking连接中断,您的SSH会话可能不需要closures,您应该能够恢复连接并继续。 那是你在问什么?

在这个问题上有一个hacky tty窃取代码的链接。 理论上你应该可以用这个来重新控制一个nohup进程。