恢复命令在已删除的SSH会话中运行


32

读了这个问题让我很纳闷。假设screen没有被使用。如果出于任何原因删除了Linux目标上的SSH会话,并且您在服务器由于超时而终止会话之前重新连接,则有可能重新获得对正在运行的命令的控制,以使其不会由于会话中断而被中止?


这是什么命令?我猜通常答案是“否”。
davr 2010年

没有特别的命令,我只是在问一个一般的概念。
约翰·加迪尼尔

1
全面了解tty会话的初始化方式的人也许可以告诉我们如何进行。好像您可以在同一tty上重新创建新会话并显式分配先前的PPID一样,这是可能的。我只是在等待一些有胡子的nix大师陪伴并震撼我们。那绝对是梦想。
CarpeNoctem

如果您尝试使用系留笔记本电脑并拔出以太网线,会发生什么情况?
保罗

@〜drpaulbrewer-与使用台式机进行操作时完全相同-连接断开。如何断开连接与该问题无关。
John Gardeniers

Answers:


13

试图将新终端的当前STD *文件描述符连接到旧的正在运行的进程只是在问麻烦。即使您确实做到了,终端的工作控制也无法按预期工作。如果最终退出接管程序,您将一团糟,而牺牲了其文件描述符以将其交给新后台进程的shell发生了什么情况。当外壳消失时,ssh会保持打开状态吗?可能不会。因此,您需要先将其重定向到其他地方。

无论可能与否,我敢打赌,更希望让被遗弃的进程被“自然地”杀死。如果您做的事情足以证明尝试执行恢复控制所需的所有黑客手段是合理的,并且您处于不稳定的链接上,则您可能应该事先知道这一点,并且只需使用screen(或vnc,或任何使您超脱的对象浮动-控制船)。:)


我发现很难选择一个要接受的答案,所以我正在接受这个答案,因为目前这是唯一有投票赞成的答案。
约翰·加迪尼尔

5

我知道这是一个古老的问题,但是我认为添加我的发现很重要,以防其他人像我一样遇到这个问题。

我还没有看到这样做的任何异常结果,但这是我使用的方法,效果非常好。有时,当我们在服务器上运行长进程时,它有时会断开ssh会话的连接。该过程以及tty会话似乎仍在运行,但是我们无法重新连接到该会话。我在下面找到了将程序拉到新连接的会话的程序。

https://github.com/nelhage/reptyr

这是更多信息

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


5
欢迎来到服务器故障!虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
EEAA 2014年

谢谢@ user215086!令人惊讶的是,这行得通!我正在编辑一个长的配置文件一段时间,添加了一堆自定义设置和精心编写的注释,并且当连接断开时几乎完成了!“ Noooooo !! ...”当我在天花板上大喊亵渎之后,我安装了reptyr等。我将ssh会话恢复到我仍留在编辑器中的位置,完成了几件事,保存完毕!!呜呜!reptyr很棒。
ColdCold

4

通常,处理此问题的正确方法是使用GNU screen或bash nohupdisown机制提前做好准备。如果使用tcsh,shell将在异常退出时放弃后台作业。

如果您不使用screen但设法通过disown方法之一使进程运行,则可以使用gdbsource)伪造重新连接到该进程:

[...]有一些肮脏的骇客,并非不可能重新打开进程的stdout / stderr / stdin。[...]

然后例如使用gdb附加到进程,执行一些调用close(0)
调用close(1)
调用close(2)
调用open(“ / dev / pts / xx”,...)
调用dup(0)
调用dup(0)
分离

现在,您必须针对情况调整此过程。我怀疑它会帮助,如果你没有设法否认的过程。如果您使用bash看到这个帖子有关使bash的自动不认退出后台进程(基本上,关闭huponexit禁用了javascript)。对于前台进程,您需要使用nohup


1

可能不会。我不能保证这是不可能的,但我真的对此表示怀疑。

一件事是由于ssh连接终止而导致无法终止shell以及可能运行的命令。这并不是那么困难,您应该能够使用nohup以及其他问题中提到的类似机制。

但是,然后假设您开始ssh somehost nuhup vim /some/file并且连接断开。您ssh somehost再次运行登录,可以看到您的vim进程仍在运行。但是,如何再次连接到该过程呢?交互式forground进程具有一个控制tty,并且在启动时为您的vim进程打开的那个已被关闭。我不确定在新的Shell中是否有任何方法可以“重新打开”它(就像在一个Shell中运行了多个后台作业一样,您无法在另一个Shell中进行任何前台工作)。

Screen已明确编写为具有此功能。在启动时,它分叉两个过程,一个终端管理过程和一个客户端过程。交互是客户端<->终端管理器<->应用程序,当您断开连接或断开连接时,客户端进程将在终端管理器继续运行的同时死亡。屏幕有一些特定的支持,以后再附加到终端管理过程中,我认为在一般情况下这是不可能的。


谢谢。那几乎是我所期望的。让我们看看是否有人可以证明我们错了。;)
John Gardeniers 10-2-24

因为写这个答案,有一个节目,我已经学会reptyr为“重新ptying”的过程。因此从理论上讲是可行的,但我仍然认为总体答案可能并非如此。
赫洛瓦尔


1

如果会话被丢弃,则意味着TTL已经过期,因此不再有tty供您使用(据我所知)。但是,如果您的网络连接中断,则SSH会话可能不需要断开,并且您应该能够恢复连接并继续。那是你要问的吗?


我总体上是在问,但是我最感兴趣的是何时网络问题导致连接断开。总体而言,我会说它看起来不太好。不过,这只是出于好奇而不是需要。知道答案之前总是很高兴。;)
John Gardeniers 2010年

断开连接似乎不是一个简单的概念。您可能会经历几个不同的阶段。例如,您应该能够拔出网络电缆,在几秒钟内将其重新插入,并且SSH会话将保持正常运行,即使您可能会遇到短暂的初始延迟,也不必重新连接即可继续。如果您发现自己的ssh会话已终止,则意味着配置错误(或者没有正确配置以支持这种中断)。
神话2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.