如何防止程序在 ssh 会话终止时终止?

如何防止程序在 ssh 会话终止时终止?

我有一个非常旧的控制台应用程序,我想让它更有弹性。该程序的使用方式如下:

  • 用户使用自定义终端模拟器通过 ssh 连接到远程计算机
  • 用户启动 shell 脚本
  • shell 脚本可能会启动一个长时间运行的进度数据库进程。

显然,有时用户只是失去了与机器的 ssh 连接,在这种情况下,ssh 会话被终止,内部运行的 shell 脚本被终止,最后进度数据库进程也被终止。在千分之一的情况下,这会导致数据库损坏,所以我想防止它发生。

到目前为止我尝试过的:

  • 在启动 shell 脚本之前启动 screen 或 tmux 会话 - 这不起作用,因为应用程序需要将 TERM 变量设置为 at386(并且它完全绕过 termcap/terminfo...呃...)
  • nohup/disown 进度进程 - 这不起作用,因为 shell 脚本和进度进程似乎以晦涩的方式不断地相互通信

关于如何确保在 ssh 会话被终止时进度进程不会终止的任何其他想法?

答案1

添加term at386到您的 .screenrc 以覆盖 TERM。如果这没有帮助,请尝试分离而不是 Screen(它本身不执行任何终端模拟)。

答案2

在许多情况下,最简单的解决方案是使用nohup非交互式进程并将其放入后台&,并将标准输出和标准错误重定向到文件。

答案3

换句话说,您正在寻找类似 screen 的东西,但它将控制序列传递到终端而不是进行自己的翻译?尝试分离。它提供与屏幕相同的终端分离功能,但没有多个窗口或终端仿真。

答案4

也许尝试通过 vnc 或 nx 远程 X 桌面。为了安全起见,您可以通过 ssh 建立 vnc 隧道,或者使用默认通过 ssh 运行的 nx(并且速度更快)。然后,该应用程序可以在 X 桌面上的终端中运行,如果连接丢失,桌面将继续运行,允许随时重新连接。我最喜欢的是 No Machine NX,它最多可以免费供两个同时用户使用,并且安装非常容易。

另一种方法(如果可用)是通过 ALOM、ILOM、DRAC、IP-kvm 或 IP 串行控制台等使用远程控制台。这样,应用程序将在控制台上运行,并且不会因连接故障而中断。

相关内容