啟動 tmux 會話並確保所有子進程終止

啟動 tmux 會話並確保所有子進程終止

我使用 tmux 進行開發,我有一個任務在一個視窗中運行,另一個任務在它自己的視窗中運行。我已設定約定,專案目錄的基本名稱是 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

在您發布的程式碼片段中,$SESSION_NAMEshell 擴展了每個外觀,並且每個外觀都tmux將擴展值作為命令列參數。

(即使它沒有,而且您想$SESSION_NAME稍後在 tmux 內或 tmux 內的 shell 內擴展它,您export SESSION_NAME="my-project-name"可能是徒勞的,因為tmux環境如何建設。該update-environment選項或new-session -e …命令可能有用。

這包括$SESSION_NAMEbind-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+的會話「標記」c為「全域 SIGINT」。可能是這樣的:

    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 中啟動的 shell(或另一個程式)可以繼承TMUX_GLOBAL_SIGINT.如果它運行tmux new-session …,那麼(取決於等等update-environment)新會話也可能繼承該變量,即使沒有顯式的-e 'TMUX_GLOBAL_SIGINT=1'.閱讀man 1 tmux並了解 tmux 如何管理環境。

相關內容