启动 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 如何管理环境。

相关内容