公众号旧文
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。
毕竟服务器最怕的不是退出连接,而是程序因为连接断开而意外停止。