解决深度终端链接远程后假死问题

起因

这是最近才出现的问题,忽然发现,深度终端链接远程服务器后,过一会就假死了。还以为是不小心安了ctrl+s,于是用ctrl+q也无法解开。依然不能输入任何内容。链接状态是保持的,但就是假死了。

在网上搜索了一下找到了解决办法。

解决方法

可以修改配置文件, 在~/.bash_profile 或者~/.bashrc的配置文件里面加上下面的参数了:

1
stty -ixon

保持退出,执行下面的命令让配置生效

1
source  .bashrc

这样就不会出现假死了。

还有一种方式,链接ssh之前增加一个-o ServerAliveInterval=60参数

1
ssh -o ServerAliveInterval=60 root@192.168.0.2

原因

出现假死主要是,由于一段时间不活动,终端进行了休眠。但是我们没法唤醒造成的。终端有一个软件流控制(XON/XOFF flow control)的功能,具体就是当client(terminal emulator), 也就是常用的终端模拟器无法接受更多的数据的时, 终端会发送一个 XOFF 信号 告诉发送数据端暂停发送, 直到收到XON信号,其中发送的 XOFF 是告诉内核的 tty 驱动将正在发送数据的进程设置为休眠状态, 直到 tty 驱动发送 XON 告诉内核恢复进程, 就好像它从来没有停过一样。

这就是为什么增加一个 stty -ixon可以解决问题的原因

默认情况下,Ctrl-s会启用终端的滚动锁定, 此时禁用终端模拟器的滚动功能 (通过发送 XOFF 信号暂停软件的输出 ),终端软件没有任何输出,造成假死的现象,一般情况都是无意识按下了ctrl+s快捷键而已。相应的,Ctrl-q 会禁用滚动锁定, 恢复终端滚动 (通过发送 XON 信号来恢复软件的输出).

linux下终端ctrl+z命令会将当前任务切换到后台执行,就无法看到了,可以使用fg命令恢复至前台

参考资料

https://www.cnblogs.com/guochaoxxl/p/10428991.html