公众号旧文

SSH 退出时,关闭窗口和 exit 有什么区别?

作者:胖子阅读 —

大家在使用 Linux 服务器时,都会通过 CMD、SecureCRT 连接 SSH。

当操作完成后,有些人习惯输入:

exit

退出连接。

而有些人则直接点击窗口右上角的关闭按钮。

那么问题来了:

执行 exit 和直接关闭窗口,到底有什么区别?

一、正常退出:exit

当你输入:

exit

或者按下:

Ctrl + D

时,实际上是在通知服务器:

工作已完成,请正常结束这次会话。

此时 SSH 客户端会向服务器发送断开请求,Shell(例如 Bash)正常退出,随后 SSH 连接被关闭。

对于服务器来说,这是正常下线。

相关资源会立即释放,不会留下多余的会话进程。

二、直接关闭窗口会发生什么?

如果你直接关闭 SecureCRT、CMD 窗口,或者因为网络中断、电脑关机导致连接断开,那么客户端往往来不及向服务器发送退出通知。

服务器最开始并不知道你已经离开。

它会认为客户端突然没反应了。

随后通过 TCP 超时机制检测连接状态。

经过一段时间后,服务器才会确认连接已经失效,并回收对应资源。

因此有时你关闭窗口后,再查看服务器在线用户信息,可能会发现会话仍然存在几十秒甚至几分钟。

三、对服务器运行的程序有影响吗?

很多人更关心这一点。

如果只是执行普通命令,例如:

ls
df -h
htop

那么无论是执行 exit 还是直接关闭窗口,影响都不大。

但是如果你正在前台运行程序:

python app.py

或者:

./server

当 SSH 会话结束时,系统通常会向程序发送挂断信号(SIGHUP)。

很多程序收到这个信号后会直接退出。

因此你可能会发现:

刚启动的网站怎么没了?

刚运行的脚本怎么停止了?

实际上并不是程序崩溃,而是 SSH 会话结束导致的。

四、为什么运维人员喜欢使用 tmux?

如果你经常管理服务器,最好养成使用 tmux 的习惯。

在 tmux 中运行程序。

即使:

  • SSH 断开
  • 网络掉线
  • 电脑关机
  • SecureCRT 崩溃

tmux 会话依然保留在服务器上。

重新登录后执行:

tmux attach

即可回到之前的工作环境。

对于长期运行任务来说,这是非常实用的工具。

五、断线后还能恢复原来的 SSH 会话吗?

答案是不能。

很多人以为关闭窗口后重新连接,可以回到原来的 SSH 会话。

实际上,SSH 的工作方式并不是这样。

一旦连接断开,原来的 SSH 会话就已经结束。

再次登录时,系统会创建一个全新的 SSH 连接和新的终端环境。

如果你看到之前的内容还在,通常是因为使用了 tmux 或 screen 之类的终端复用工具,而不是 SSH 本身具备恢复功能。

总结

对于普通用户来说,执行 exit 和直接关闭窗口都会断开 SSH 连接,差别并不算大。

不过从规范和运维习惯来看,执行 exit 属于正常退出方式,可以让服务器立即释放资源,也能在日志中留下更完整的记录。

而对于需要长期运行任务的用户来说,真正需要掌握的并不是 exit,而是 tmux。

毕竟服务器最怕的不是退出连接,而是程序因为连接断开而意外停止。