我如何在shell脚本中切换活动的tmux会话?

问题描述 投票:0回答:1

我正试图创建一个自动清洁关闭我的 opensimulator 服务器。

在每个服务器上,我有几个Tmux会话。在每个会话中,有几个窗口。在下面的例子中,为了保持简单,只有两个会话。

sara@opensim:~$ tmux ls
Robust: 5 windows (created Tue May 12 22:08:28 2020)
Simulators01: 6 windows (created Tue May 12 23:30:38 2020)
sara@opensim:~$

在完整版中,将有10多个模拟器会话。

我想做的是使用一个shell脚本来选择一个特定的会话。每个会话都会有一个类似于这样的关闭shell脚本。

#!/usr/bin/env bash
SESSION="InstancesTesting"
echo "checking for session - $SESSION"
SESSIONEXISTS=$(tmux list-sessions | grep $SESSION)
if [ "$SESSIONEXISTS" != "" ]
then
        echo "session found"
        tmux attach-session -d -t $SESSION
        tmux select-window -t '0821'
        tmux send-keys -t '0821' 'quit' C-m
        tmux select-window -t '0900'
        tmux send-keys -t '0900' 'quit' C-m
        tmux select-window -t '0901'
        tmux send-keys -t '0901' 'quit' C-m
        tmux select-window -t '0910'
        tmux send-keys -t '0910' 'quit' C-m
        tmux select-window -t '0911'
        tmux send-keys -t '0911' 'quit' C-m
        tmux select-window -t '0920'
        tmux send-keys -t '0920' 'quit' C-m
        echo "finished shut down call for $SESSION"
else
   echo "session not found skipping"
fi

问题行是

tmux attach-session -d -t $SESSION

当它从shell脚本运行时,之后的一切都会停止,直到会话被分离。但是,如果不附加会话,只能访问最后附加会话的窗口。

我不能在退出命令结束时简单地杀死会话,因为每个窗口内运行的模拟程序可能需要10分钟才能关闭。我也不想在每次关机之间等待10分钟。我想把它们全部设置为运行,然后等待进程关闭后再重启。

我需要做的是:1.附加一个会话,让脚本继续运行,而不需要按ctrl+b D来分离。改变正在访问的会话,而不像上面的例子那样实际附加它。

我也试过

tmux switch-client SessionName
tmux switch-client -t SessionName
tmux switch-client -n

所有这些都返回相同的结果

no current client

我也试过

tmux send-keys -t 'WindowName' 'tmux choose-session' C-m
tmux send-keys -t 'WindowName' '0' C-m

不幸的是,这个选项也说明没有客户端。

我相信这一定是可能的,我在兜圈子,请大家帮忙。

tmux
1个回答
1
投票

没有 "选择的会话 "的概念,客户端有一个附加的会话,但在tmux之外,当你不指定一个会话时,每次都会单独选择使用哪个会话。请看这里。https:/github.comtmuxtmuxwikiAdvanced-Use#the-default-target#。

但你不应该需要它。你已经在使用 -t 来指定窗口,也可以用它来指定会话。

 tmux send-keys -t "$SESSION:8021" 'quit' C-m

你不需要 select-window 除非你以后打算附加,然后一 select-window 末尾就可以了。见 https:/github.comtmuxtmuxwikiAdvanced-Use#command-targets。 以了解目标的描述。

您也可以找到 has-session 命令,而不是使用 grep-F 旗帜鲜明 list-sessions.

© www.soinside.com 2019 - 2024. All rights reserved.