从另一终端继续生成路线图

LinuxBeginner
立即练习

介绍

社区步道服务站正在为游客准备路线卡。提供的制图程序会在一个小型模拟网络中计算路径,并绘制真实的 SVG 地图。它先生成一批地图,然后等待你选择下一批与路线模式。下一组游客需要避开台阶,因此仅让第一个命令在后台运行还不够:你必须重新回到程序的输入提示处。

你将在 Terminal A 中启动一个具名 tmux 会话,分离连接,再从 Terminal B 继续同一进程,最后在 Maps 中使用生成的地图集。只需熟悉基本终端操作;无需编写 Python,也不需要制图经验。所有路线都是模拟训练数据,不是实际步道的导航指引。

启动具名制图任务

本步骤中,你将启动一个真实的交互式制图任务,并让它等待下一批选择。

Shell 读取命令,任务则是 shell 启动的程序。tmux 在后台的服务器中保留终端和任务。具名会话组织多个窗口,每个窗口中都有终端。客户端将浏览器终端连接到该会话。分离只移除客户端,服务器与任务仍继续运行。VM 或服务器被销毁后,tmux 不能恢复工作。

两个浏览器终端都从 /home/labex/project/trail-maps 开始,且已分别位于平台的 tmux 会话中。plan.tsv 是相对路径,指当前目录里的文件。不要在其中再创建一层已连接的 tmux。先在 Terminal A 读取计划。cat 显示文件内容;各列依次说明任务、下一批、路线模式和原因。

cat plan.tsv

survey 任务需要以 step-free 模式生成 east 批次。walking 允许使用台阶;step-free 会先排除所有带台阶的边,再计算最短路线。第一批使用 walking,所以其较短路线可能合理地与后续结果不同。无需地理知识。

列出会话。list-sessions 是 tmux 命令;保留已准备的 trail-reference 会话。以 TTYD- 开头的名称属于平台。

tmux list-sessions

创建 trail-survey。new-session 创建会话,-d 使其保持分离,-s 指定唯一名称。最后一个带引号的参数是在其终端内运行的命令。python3 运行提供的程序,guided 选择本实验的独立任务。制图程序会直接在这个会话中启动。

tmux new-session -d -s trail-survey 'python3 /opt/labex/atlas/map-job.py guided'

连接该会话。attach-session 用 -t 选择目标。在平台已有的 tmux 客户端内,这会改变客户端所连接的会话,而不会再嵌套一层 tmux。

tmux attach-session -t trail-survey

程序的绝对路径指定了已准备的制图工具。它会报告 PID,写入两个 morning SVG 文件,然后停在 Next batch:。留意这个 PID:Terminal B 必须显示同一个值。程序仍然存活,正在等输入;没有 shell 提示符是正常现象。不要向这个问题输入 shell 命令。

若创建会话时出现 duplicate session,列出会话并连接已有的 trail-survey;不要删除文件或启动替代任务。若看到 sessions should be nested with care,说明你试图在 tmux 内创建已连接的 new-session:返回平台 shell,使用前述分离创建方式。让制图程序继续等待,并验证本步骤。

从 Terminal B 继续

本步骤中,你将分离第一个客户端,再通过第二个独立终端完成下一批。

聚焦 Terminal A。按住 Ctrl 并按 B,松开两键,然后按 D。这是一个前缀键组合加后续按键,不是同时按住三个键。它向 tmux 发送分离命令。不要使用 exit 或 Ctrl+C:它们会退出 shell 或中断制图程序,而不是断开显示连接。

浏览器会显示 [detached (from session trail-survey)]。由于平台直接启动 tmux,这个浏览器终端没有可返回的外层 shell。让它保持当前状态。打开 Terminal B,它拥有自己持续存在的 shell。关闭浏览器标签页或网络断线是另一类事件;本练习有意验证同一 VM 上的分离与重新连接。

在 Terminal B 列出会话:

tmux list-sessions

trail-survey 应仍在列表中,此时没有客户端连接。重新连接这个准确的名称:

tmux attach-session -t trail-survey

你应看到先前相同的 PID 和 Next batch: 问题。若仍看到 shell 提示符,说明尚未连接制图程序。若看到其他任务,请先分离,再选择正确名称,不要向它发送答案。

在程序提示处输入计划要求的下一批。这是给制图程序的输入,不是 shell 命令:

east

它接着询问 Route mode:。输入计划中的无障碍模式:

step-free

写入文件之前,程序会显示 Plan: east / step-free 并询问 Build this batch? [yes/no]:。一起核对批次和模式。若其中任何一项不对,输入 no,即可在同一进程中返回 Next batch:,原有地图不会改变。选择正确计划后确认:

yes

程序计算两条新路线,写入 SVG,并更新地图集索引。应看到 Collection ready: 4 real SVG maps and index.json.。最后的 Inspection mode 提示有意保持原进程存活以便检查,请保留它。无效的批次名称或模式会被拒绝,第一批不会丢失,因此读清提示后重答当前问题即可。合法但选错的选项可以在确认处纠正:输入 no 再选。刷新浏览器不会改变待确认的计划。确认 yes 后,这个地图集即为最终结果,所以提交前请对照计划。不要删除文件或重启进程来掩饰新建任务。

检查器会比较活进程、准确路线和完整索引。另起一个输出相似的新进程并不代表继续了原任务。

使用完成的地图集

本步骤中,你将查看实际地图和机器可读索引,同时保持任务可用。

打开 Maps,选择 survey/ 目录。前两张卡片是原来的 morning 地图,后两张是采用 step-free 模式的 east 地图。在 east 批次前往 Cabin 的路线卡上点击 Download SVG,保存 SVG。绿色路线应经过 Orchard,避开 Bridge 一带带台阶的边。第一批前往 Cabin 的 morning 路线可能经过 Bridge。差异来自所选模式参与的图计算,而不只是修改标签。

返回地图集,阅读 east 批次前往 Lookout 的路线。路线和用时也记录在 index.json 中。要查看数据,请留在 Terminal B,按 Ctrl+B,再按 C。这会创建一个包含 shell 的 tmux 窗口,制图程序仍在窗口 0 运行。窗口是同一具名会话中的另一个终端,不会重启程序。看到 shell 提示符,就表示可以再次输入命令。

用 cd 明确设置 shell 的当前目录。绝对路径从 / 开始,因此无论新 shell 起初位于哪里,该命令都能使用:

cd /home/labex/project/trail-maps

ls 列出目录内的名称。确认四张地图、HTML 查看页面、索引和进程信息都在:

ls survey

用相对路径显示索引:

cat survey/index.json

每条记录包含批次、模式、目的地、分钟数和计算得到的节点序列。原有地图与新地图同时保留。这是可以使用的地图集,而不只是完成消息。

再次列出会话:

tmux list-sessions

trail-survey 和 trail-reference 都必须保留。会话即使处于分离状态也可以继续运行。平台的 TTYD- 会话与业务任务无关。不要用 kill-server 清理环境:它会终止包括参考任务在内的所有会话。在检查通过前保留环境。要回到原制图程序,按 Ctrl+B,再按数字 0。这会选择窗口 0;检查提示和同一个 PID 应仍然存在。

你已经在功能上让一个进程跨两个浏览器终端继续运行。这不证明 VM 重启恢复、物理机器切换、自动任务重试或平台网络重连行为。

总结

你创建了具名 tmux 会话,分离一个客户端,并从另一终端重新连接,继续回答同一个存活的制图程序。地图集同时包含原有步行地图、计划要求的无台阶地图及其准确索引,你也保留了参考会话。会话连续性依赖 tmux 服务器和 VM 持续存活。