我有一个非常旧的控制台应用程序,我想让它更有弹性。该程序的使用方式如下:
- 用户使用自定义终端模拟器通过 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 串行控制台等使用远程控制台。这样,应用程序将在控制台上运行,并且不会因连接故障而中断。