首先要预见到混乱:这确实是在问与你的普通 tmux 问题相反的问题。
如何确保即使 SSH 隧道失效,tmux 会话也不会被泄露。当在同一个 SSH 会话上运行多个 shell 时,在一个终端中彻底终止会话和 tmux 实例仍会导致其他终端中的 tmux 实例泄漏。如果例如忘记终止隐藏在某个后台窗格中的资源消耗进程,这可能会导致各种麻烦。不酷。
我几乎完全将 tmux 用作终端仿真器,并且对其“分离”功能几乎没有用处。我在终端中有多个 tmux 实例通过单个 SSH 会话访问同一台计算机,这种情况并不罕见。如果我想运行后台进程,我会向 shell 请求disown
它或在 systemd 中运行它。不幸的是,我日常使用的许多系统尚未升级到 systemd,并且在不久的将来不太可能升级,因此这KillUserProcesses
不是一个选择。
理想情况下,我只需使用一些命令行开关来调用 tmux,以防止它在后台运行,这样我就可以将其别名为tmux
.
什么 SSH 隧道?
一个 OpenSSH 连接服务于多个会话。
什么 tmux 会话?
单独的 tmux 实例,每个 SSH 会话一个。
什么泄漏?
tmux 实例泄漏。如:通过 SSH 连接到机器。通过同一连接启动另一个 shell 会话。在每个 SSH 会话中启动一个 tmux 实例。您现在有两个 tmux 实例。在一个会话中停止 tmux ( <C-d>
);然后停止 SSH 连接(再次<C-d>
):另一个 SSH 会话已关闭,但其中运行的 tmux 实例及其所有子进程都被泄漏。
请描述:(1)您现在有什么设置,
库存 OpenSSH、库存 tmux、一些 shell。大多数是反向 SSH 连接 我无法随意重新建立,但这并不重要。
(2) 您想要防止什么情况发生。
进程在其他 tmux 会话中保持活动状态。
请注意,这些是通过 SSH 连接到的不同盒子,因此目标是防止连接终止后单个 tmux 实例保持活动状态。另外,由于我大量使用分割窗格和背景窗口,我真的希望收集所有子进程。
答案1
使用新ssh
会话进行日志记录时,您可以使用tmux attach -d || tmux new
附加任何现有tmux
会话或创建新会话(如果不tmux
存在会话)之类的方法。虽然这不会阻止tmux
会话在ssh
连接断开时在后台运行,但它会阻止这些废弃的会话累积。
答案2
我相信你的问题可以通过使用完全避免莫什。
Mosh 支持间歇性连接,并且仅mosh-server
在未正确断开连接(例如在与服务器断开连接时强行关闭客户端)的情况下才会泄漏实例。