摘要:我试图弄清楚为什么我从ssh断开连接后,tmux会话会死掉
详细资料:
我在Arch Linux系统上安装了tmux。当我启动tmux会话时,我可以从中分离出来,然后在ssh会话处于活动状态时再次附加。但是,如果我结束ssh会话,则tmux会话将被杀死。
我知道这不是正常的行为,因为即使ssh会话已结束,我也有其他系统在其中tmux会话继续运行,并且可以在建立新的ssh连接后附加到tmux会话。有问题的系统和可以正常工作的系统具有非常相似的配置,因此我不确定要检查什么。
我正在运行tmux 1.9a版本。有问题(我具有root用户访问权限)的系统具有3.17.4-1的Linux内核版本,而工作正常的系统具有3.16.4-1-ARCH的内核(我没有root权限)系统)。我怀疑内核版本是否是问题的根源,那只是我注意到的一个区别。
我想问一下是否有人遇到过类似的问题并知道可能的解决方案。
导致问题的确切步骤是:
- SSH到机器
- 运行
tmux
以启动tmux ctrl-B D
分离(此时我可以重新连接tmux attach
- 关闭ssh会话(此时tmux会话已终止,当我以root身份登录到另一个终端时,已经能够观察到此情况)
- 与SSH重新连接并运行
tmux attach
,我得到消息no sessions
和运行tmux ls
返回failed to connect to server: Connection refused
。这是有道理的,因为服务未运行。对我来说没有意义的是为什么当我从ssh会话断开连接时,它在步骤4中被杀死。
跟踪数据:
作为对其中一项评论的回应,我使用了strace来查看什么系统调用了tmux服务器进程。当我退出ssh会话(通过键入exit
或使用ctrl-d
)时,tmux进程被杀死了。这是strace输出的最后一部分。
poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0) = 1
+++ killed by SIGKILL +++
我将其与tmux正常工作的另一个系统进行了比较,即使在退出后,tmux进程仍在该系统上继续运行。因此,根本原因似乎是当我关闭ssh会话时tmux进程被终止了。我需要花一些时间来解决这个问题,以找出原因,但是我认为我会更新我的问题,因为strace建议很有用。