tmuxセッションを開始し、すべての子プロセスが終了することを確認する

tmuxセッションを開始し、すべての子プロセスが終了することを確認する

私は開発に tmux を使用しています。1 つのタスクをウィンドウ内で実行し、もう 1 つのタスクを独自のウィンドウで実行しています。プロジェクト ディレクトリのベース名が tmux セッション名になるように規則を設定しました。

export SESSION_NAME="my-project-name"
tmux kill-session -t "$SESSION_NAME"
tmux new-session -s "$SESSION_NAME" \
                "api.start --monitored" \; \
                split-window "ui.start --monitored" \; \
                select-layout tiled \; \
                set-option -w remain-on-exit on \; \
                set-option -w mouse on \; \
                set-option -g mouse on \; \
                bind-key -n C-c kill-session -t "$SESSION_NAME"

すべては正常に動作しているようですが、同じ規則で別のプロジェクトを開始する場合、最初のセッションで CTRL+c を押すと、SESSION_NAME が tmux によって生成された最新のセッションの 1 つであると認識されてしまいます。これは期待していた結果ではありません。

答え1

あなたが投稿したスニペットでは、 のすべての出現$SESSION_NAMEがシェルによって展開され、それぞれがtmux展開された値をコマンドライン引数として取得します。

(たとえそうでなかったとしても、これを$SESSION_NAME後でtmux内またはtmux内のシェル内で展開したい場合、export SESSION_NAME="my-project-name"tmux環境を構築する方法オプションupdate-environmentまたはnew-session -e …コマンドが役に立つ場合があります。

これ$SESSION_NAMEにはが含まれますbind-key -n C-c kill-session -t "$SESSION_NAME"tmux実行:

bind-key -n C-c kill-session -t my-project-name

別のプロジェクトの場合、tmux コマンドは次のようになります。

bind-key -n C-c kill-session -t different-name

重要なのは、bind-keyそれ自体が単一のセッションをターゲットにしていないことです。 tmux サーバー全体の+bind-key -n C-c …の動作を変更します。 あなたの場合、最後の割り当てが以前の割り当てを上書きし、その後、どのセッションでも+ が実行されます。Ctrlcbind-keyCtrlckill-session -t different-name

key-tableオプションを使用して、各セッションごとにデフォルトのキーテーブルを 以外のものに設定できると思いますroot。新しいキーテーブルごとに、 に異なるバインディングを設定できますC-c。これはテストしていませんが、考えるそれは可能かもしれない。

もし私があなただったら、もっと簡単なことをするでしょう。私はこうするでしょう:

tmux bind-key -n C-c kill-session

kill-session-t目標がなければ現在セッションなので、このバインディングはmy-project-namedifferent-nameまたは他のセッションに対して必要なことを実行するはずです。

正直に言うと、「他のセッション」は私にはCtrl無理です。c一般的用途セッション。私はこれを解決します:

  • そのままにしてC-c、別のキーストロークを「グローバル SIGINT」として選択し、その後、どちらか一方を誤って使用するか、

  • Ctrlまたは、 + を「グローバル SIGINT」として使用する必要があるセッションを明示的に「マーク」することによっても実現cできます。次のようになります。

    tmux new-session -e 'TMUX_GLOBAL_SIGINT=1' \; \
          bind-key -n C-c if-shell '[ -n "$TMUX_GLOBAL_SIGINT" ]' kill-session 'send-keys C-c'
    

    TMUX_GLOBAL_SIGINT環境内に空でない変数を持つすべてのセッションで、Ctrl+はcセッションを強制終了します。 がTMUX_GLOBAL_SIGINT空または設定されていないすべてのセッションでは、 Ctrl+ はc通常どおり動作します。

    ノート:

    • tmux set-environment -u TMUX_GLOBAL_SIGINTすでに開始されているセッションの場合は、または を使用して設定を変更できますtmux set-environment TMUX_GLOBAL_SIGINT 1(-t必ずしも現在のセッションではなく、特定のセッションをターゲットにするために使用します)。

    • tmux で起動されたシェル (または別のプログラム) は を継承する場合がありますTMUX_GLOBAL_SIGINT。 実行されるtmux new-session …と ( や などに応じてupdate-environment)、明示的な がなくても、新しいセッションは 変数も継承する場合があります-e 'TMUX_GLOBAL_SIGINT=1'man 1 tmuxtmux が環境を管理する方法について読んで学習してください。

関連情報