用 tmux 保持远程 ssh 连接

用户通过 ssh 连接到远程主机,如果 ssh 在尚有任务执行时挂断,正在运行的任务会因收到 SIGHUP 信号而退出。为了避免消耗本地资源,并消除网络不稳定对任务的影响,我们可以设法假装远程 ssh 连接始终存在:终端复用器 tmux 正好可以担此重任。

tmux 作弊的原理很简单。它运行在远程主机上,充当中介的作用。本地终端应首先 ssh 到远程主机,然后装载一个 tmux 会话,在会话内的 shell 中运行任务。本地切断 ssh 连接前,应当先卸载 tmux 会话。由于 tmux 在远程主机上运行,它可以装作 ssh 连接从未中断。等本地终端再次登录时,又能重新装载会话,恢复至连接切断前的状态。

这一过程中涉及的指令有如下几个。

tmux ls 用于查看当前所有已创建的 tmux 会话。好比查看存档一样,我们在打开 tmux 会话前使用它。

tmux new -s name 创建一个名为 "name" 的新会话。tmux 默认的会话名称是 0、1、2... 为了便于记忆,最好在会话创建时指定一个名称。会话的名称可用 tmux ls 查看。

tmux detach 卸载当前会话。为了保证这个指令可以被 shell 读取,应使用 & 字符让任务在后台运行。tmux detach 并没有切断 ssh 连接,它只是将当前 shell 交付给 tmux 管理而已。尽管快捷键 Ctrl-b d 可以起到相同的效果,但由于一些 ssh 终端不支持发送 Ctrl-btmux detach 在实用性上更胜一筹。

tmux rename -t old-name new-name 可以修改一个会话的名称。

tmux attach -t name 装载一个已创建的会话。通常在下次 ssh 登录时,使用它恢复先前的状态。

tmux kill-session -t name 销毁一个会话。在 tmux 看来这等同于断开 ssh 连接,也就是说,正在运行的任务会因 SIGHUP 而退出。