はじめに
地域の遊歩道案内所では、来訪者用の経路カードを準備しています。用意されたプログラムは、小さな架空のネットワークで経路を計算し、実際の SVG 地図を描きます。最初の一組を作成すると、次のバッチと経路モードの入力を待ちます。次のグループには階段のない経路が必要です。最初のコマンドをバックグラウンドで動かすだけでは足りず、入力プロンプトに戻る必要があります。
Terminal A で名前付き tmux セッションを起動し、接続をデタッチしてから、Terminal B で同じプロセスを続行します。完成した地図集は Maps で使用します。基本的なターミナル操作が分かれば十分で、Python の記述や地図作成の経験は不要です。経路はすべて学習用の架空データであり、実際の遊歩道の道案内ではありません。
名前付きの地図作成タスクを起動する
このステップでは、実際の対話型地図作成タスクを起動し、次のバッチを待つ状態にします。
シェルはコマンドを読み取り、タスクはシェルが起動するプログラムです。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 を 2 枚書き込み、Next batch: で待ちます。PID を確認してください。Terminal B でも同じ値が表示される必要があります。プログラムは生きており、入力を待っています。シェルのプロンプトがないのは正常です。この質問にシェルコマンドを入力しないでください。
作成時に duplicate session と表示されたら、セッションを一覧表示して既存の trail-survey に接続します。ファイルを削除したり、代わりのタスクを起動したりしないでください。sessions should be nested with care が出た場合は、tmux 内で接続状態の new-session を試みています。プラットフォームのシェルに戻り、上記のデタッチ作成を使ってください。ツールを待機させたまま、このステップを検証します。
Terminal B から続行する
このステップでは、最初のクライアントをデタッチし、独立した 2 つ目の端末から次のバッチを完成させます。
Terminal A にフォーカスします。Ctrl を押しながら B を押し、両方を離してから D を押します。これはプレフィックスの後にキーを押す操作で、3 つのキーを同時に押し続ける操作ではありません。tmux にデタッチ命令を送ります。exit や Ctrl+C は使わないでください。表示の接続を外すのではなく、シェルを終了したり、地図作成ツールを中断したりします。
ブラウザーには [detached (from session trail-survey)] と表示されます。プラットフォームは tmux を直接起動するため、この端末には戻り先の外側のシェルがありません。そのままにしてください。独自の永続シェルを持つ Terminal B を開きます。ブラウザータブを閉じることやネットワーク切断は別の事象です。この演習では同一 VM 上での意図的なデタッチと再接続を検証します。
Terminal B でセッションを一覧表示します。
tmux list-sessions
trail-survey は引き続き表示され、接続中のクライアントはなくなっているはずです。その正確な名前に再接続します。
tmux attach-session -t trail-survey
同じ PID と Next batch: の質問が見えるはずです。まだシェルのプロンプトが見えるなら、ツールには接続できていません。別のタスクが見えたら、デタッチして正しい名前を選び直し、そのタスクには回答しないでください。
プログラムの質問に、指定された次のバッチを入力します。これは地図作成ツールへの入力であり、シェルコマンドではありません。
east
次に Route mode: と質問されます。計画にある階段を避けるモードを指定します。
step-free
ファイルを書く前に、Plan: east / step-free が表示され、Build this batch? [yes/no]: と質問されます。バッチとモードを合わせて確認してください。どちらかが違う場合、no と入力すると同じプロセスの Next batch: に戻り、元の地図は変わりません。正しい計画を選んだら確定します。
yes
プログラムはさらに 2 本の経路を計算し、その SVG を書き、索引を更新します。Collection ready: 4 real SVG maps and index.json. が表示されるはずです。最後の Inspection mode は、調べられるよう元のプロセスを意図的に生かしておくプロンプトです。そのまま残してください。無効なバッチ名やモードは最初のバッチを失わずに拒否されるため、表示を読んで同じ質問に答え直せます。有効でも間違った選択は、確定時に no と答えて選び直せます。ブラウザーの再読み込みは保留中の計画を変えません。yes で確定するとこの地図集は最終状態になるため、確定前に計画と照合してください。ファイルを削除したりプロセスを再起動したりして、新しいタスクを続行に見せかけないでください。
検証は、生きているプロセス、正確な経路、完全な索引を比較します。似た出力を持つ新しいプロセスを作っても、このタスクを続行したことにはなりません。
完成した地図集を使う
このステップでは、タスクを利用可能な状態に保ちながら、実際の地図と機械可読の索引を確認します。
Maps を開いて survey/ を選びます。最初の 2 枚のカードは元の morning 地図です。次の 2 枚は step-free モードの east 地図です。east の Cabin 行きルートで Download SVG を選び、SVG を保存してください。緑の経路は Orchard を通り、Bridge の階段のある辺を避けるはずです。最初の morning の Cabin 行きは Bridge を通る場合があります。この違いは選択したモードを使ったグラフ計算によるもので、ラベルの変更だけではありません。
地図集に戻り、east の Lookout 行きを読みます。経路と所要時間は index.json にも記録されています。データを調べるには Terminal B に留まり、Ctrl+B、続いて C を押します。シェルを持つ新しい tmux ウィンドウが作られ、地図作成ツールはウィンドウ 0 で動き続けます。ウィンドウは同じ名前付きセッション内の別の端末であり、プログラムを再起動しません。シェルのプロンプトが表示されたら、再びコマンドを入力できます。
cd でシェルの現在のディレクトリを明示します。絶対パスは / から始まるため、新しいシェルがどこから始まっても使えます。
cd /home/labex/project/trail-maps
ls はディレクトリ内の名前を一覧表示します。4 枚の地図、HTML ビューアー、索引、プロセス情報があることを確認します。
ls survey
相対パスで索引を表示します。
cat survey/index.json
各レコードには、バッチ、モード、目的地、分数、計算されたノード列が含まれます。元の地図も新しい地図と一緒に残っています。単なる完了メッセージではなく、実際に使える地図集です。
もう一度セッションを一覧表示します。
tmux list-sessions
trail-survey と trail-reference の両方を残す必要があります。セッションはデタッチされていても動き続けられます。プラットフォームの TTYD- セッションは業務タスクとは無関係です。片付けのために kill-server を使わないでください。参考タスクを含む全セッションが終了します。検証に合格するまで環境を維持してください。元のツールに戻るには Ctrl+B、続いて数字の 0 を押します。ウィンドウ 0 が選択され、検査用プロンプトと同じ PID が引き続き見えるはずです。
1 つのプロセスを 2 つのブラウザー端末間で続行する機能を実証しました。ただし、VM 再起動後の復旧、物理マシンの切り替え、自動再試行、プラットフォームのネットワーク再接続を実証したわけではありません。
まとめ
名前付き tmux セッションを作成し、1 つのクライアントをデタッチし、別の端末から同じ生きた地図作成ツールに再接続して回答を続けました。地図集には元の歩行用地図、指定された階段のない地図、それらの正確な索引がそろっています。参考セッションも保持しました。セッションの継続には tmux サーバーと VM が生きている必要があります。



