我如何在 shell 脚本中切换活动的 tmux 会话
How do i switch the active tmux session inside a shell script
我正在尝试创建我的 opensimulator 服务器的自动干净关闭。
在每个服务器上,我有几个 Tmux 会话。在每个会话中,有几个 windows。在下面的示例中,为了简单起见,只有两个会话。
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 脚本来 select 特定会话。每个会话都会有一个关闭 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 脚本的 运行 时,之后的所有内容都会停止,直到会话被分离。但是,如果不附加会话,则只能访问最后一个附加会话的 windows。
我不能简单地在退出命令结束时终止会话,因为每个 window 中的模拟 运行ning 最多可能需要 10 分钟才能关闭。我也不想在每次关机之间等待 10 分钟。我想将它们全部设置好,然后等待进程关闭,然后再重新启动。
我需要的是:
1. 附加一个会话并允许脚本保持 运行ning 而无需按 ctrl+b D 分离。
要么
2. 更改正在访问的会话,而不像上面的例子那样实际附加它。
我也试过了
tmux switch-client SessionName
tmux switch-client -t SessionName
tmux switch-client -n
所有这些return相同的结果
no current client
我也试过了
tmux send-keys -t 'WindowName' 'tmux choose-session' C-m
tmux send-keys -t 'WindowName' '0' C-m
不幸的是,此选项还声明没有客户端。
我相信这一定是可以的,我在兜圈子,请帮忙
没有 "selected session" 的概念,当您没有指定会话时,客户端有一个附加会话但在 tmux 之外,每次单独选择要使用的会话。看这里:https://github.com/tmux/tmux/wiki/Advanced-Use#the-default-target
但你不应该需要它。您已经在使用 -t
来指定 window,也可以使用它来指定会话:
tmux send-keys -t "$SESSION:8021" 'quit' C-m
你也不需要 select-window
除非你以后打算附加,然后在最后一个 select-window
就可以了。有关目标的说明,请参阅 https://github.com/tmux/tmux/wiki/Advanced-Use#command-targets。
您可能还会发现 has-session
命令比使用 grep
更有用,或者 -F
标记为 list-sessions
。
我正在尝试创建我的 opensimulator 服务器的自动干净关闭。
在每个服务器上,我有几个 Tmux 会话。在每个会话中,有几个 windows。在下面的示例中,为了简单起见,只有两个会话。
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 脚本来 select 特定会话。每个会话都会有一个关闭 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 脚本的 运行 时,之后的所有内容都会停止,直到会话被分离。但是,如果不附加会话,则只能访问最后一个附加会话的 windows。
我不能简单地在退出命令结束时终止会话,因为每个 window 中的模拟 运行ning 最多可能需要 10 分钟才能关闭。我也不想在每次关机之间等待 10 分钟。我想将它们全部设置好,然后等待进程关闭,然后再重新启动。
我需要的是: 1. 附加一个会话并允许脚本保持 运行ning 而无需按 ctrl+b D 分离。 要么 2. 更改正在访问的会话,而不像上面的例子那样实际附加它。
我也试过了
tmux switch-client SessionName
tmux switch-client -t SessionName
tmux switch-client -n
所有这些return相同的结果
no current client
我也试过了
tmux send-keys -t 'WindowName' 'tmux choose-session' C-m
tmux send-keys -t 'WindowName' '0' C-m
不幸的是,此选项还声明没有客户端。
我相信这一定是可以的,我在兜圈子,请帮忙
没有 "selected session" 的概念,当您没有指定会话时,客户端有一个附加会话但在 tmux 之外,每次单独选择要使用的会话。看这里:https://github.com/tmux/tmux/wiki/Advanced-Use#the-default-target
但你不应该需要它。您已经在使用 -t
来指定 window,也可以使用它来指定会话:
tmux send-keys -t "$SESSION:8021" 'quit' C-m
你也不需要 select-window
除非你以后打算附加,然后在最后一个 select-window
就可以了。有关目标的说明,请参阅 https://github.com/tmux/tmux/wiki/Advanced-Use#command-targets。
您可能还会发现 has-session
命令比使用 grep
更有用,或者 -F
标记为 list-sessions
。