tmux 的会话与窗口
目标
创建 tmux 会话和窗口,确认 detach 状态,验证配置文件是否真正应用到服务器,最后编写能够重现开发环境的脚本。
为什么重要
在 tmux 中,真正执行命令的不是你的终端,而是 tmux 服务器进程。你的终端只是接收并显示画面的客户端。SSH 断开时,客户端会消失,但服务器及其子进程完全不受影响——因此重新连接并 attach 后,连画面都会原样恢复。这正是它与 nohup 的决定性区别:nohup 能让任务继续运行,却无法恢复画面和输入。最后一步之所以要求编写脚本,是因为手工创建的布局会在服务器重启后消失,而脚本会保留下来。
步骤
- 创建名为
work的会话。 - 在
work会话中添加窗口,使总数至少达到 3 个,并将其中一个命名为logs。 - 将
work会话的第 0 个窗口重命名为edit。 - 从
work会话 detach。会话必须仍然存活,且不能有任何已连接的客户端。 - 创建
deploy会话,但不要连接,并确保其中有一个名为build的窗口。 - 创建
/root/.tmux.conf,设置以下四项:prefix 改为C-a、启用鼠标、窗口索引从 1 开始、pane 索引从 1 开始。 - 创建任意文件,在
work会话的logs窗口中用tail -f持续跟踪。评分时该命令必须仍在运行。 - 创建
/root/tmux/session.sh <세션이름>。脚本应创建以参数命名的会话但不要连接,其中必须有api和db两个窗口。使用同一名称执行两次也必须成功,并且窗口数量不能增加。
提示
- 使用
tmux new-session -d -s 이름 -n 첫윈도우이름可以创建会话而不连接。 tmux has-session -t 이름 2>/dev/null在会话存在时返回 0。这是实现幂等性的关键。- 目标格式为
세션:윈도우.페인,例如work:logs。 - 评分器检查第 6 步时,会在独立套接字上启动临时服务器,让它真正读取该配置文件。即使文件中有内容,只要存在语法错误也会失败。
- 常见错误 1:第 8 步把会话名写死,就失去了接收参数的意义。
- 常见错误 2:第 8 步省略
-d,脚本就会尝试 attach,导致自动化流程卡住。
创建第一个会话
创建名为 work 的会话。
使用 tmux new -s 名称 创建会话。创建会话时服务器也会同时启动。
添加窗口并命名
在 work 会话中添加窗口,使总数至少达到 3 个,并将其中一个命名为 logs。
prefix + c 创建新窗口,prefix + , 重命名。使用 CLI 时可执行 new-window -n 名称。
重命名第 0 个窗口
将 work 会话的第 0 个窗口重命名为 edit。
rename-window 命令可通过 -t 指定目标。目标格式为 会话:窗口。
分离会话
从 work 会话 detach。会话必须仍然存活,且不能有任何已连接的客户端。
使用 prefix + d 分离。会话不能消失,必须继续留在服务器中。
创建会话但不连接
创建 deploy 会话,但不要连接,并确保其中有一个名为 build 的窗口。
使用 -d 选项只创建而不连接。第一个窗口的名称通过 -n 指定。
创建配置文件
创建 /root/.tmux.conf,设置以下四项:prefix 改为 C-a、启用鼠标、窗口索引从 1 开始、pane 索引从 1 开始。
更改 prefix 需要同时使用 unbind 与 set -g。pane-base-index 属于窗口选项,应使用 setw 设置。
把长期运行的进程留在会话中
创建任意文件,在 work 会话的 logs 窗口中用 tail -f 持续跟踪。评分时该命令必须仍在运行。
创建一个文件并用 tail -f 持续跟踪。它必须一直在 logs 窗口中运行。
会话引导脚本
创建 /root/tmux/session.sh <세션이름>。脚本应创建以参数命名的会话但不要连接,其中必须有 api 和 db 两个窗口。使用同一名称执行两次也必须成功,并且窗口数量不能增加。
用 $1 接收会话名;如果已存在,则保持原样并成功结束。可以用 has-session 检查。