我正在寻找一个可以像这样运行的 ssh / tmux 解决方案:
- 如果没有会话,则创建一个
- 如果存在会话但无人连接,则创建另一个会话
我主要希望能够为同一台服务器创建新的会话,显然如果有多个会话没有人连接到它,它应该选择第一个。
这应该使我能够将其作为 ssh 连接的默认命令。
我当前的解决方案ssh -t 'tmux a || tmux || /bin/bash'
无法按预期工作,因为当您尝试再次连接时,它将连接到现有会话,在这种情况下,我想要一个新的会话。
答案1
我不确定从哪个版本开始,但现在你可以使用
tmux new -A -s <session-name>
如果 session-name 已经存在,-A 标志会使 new-session 的行为类似于 attachment-session
答案2
这是一种奇怪的用例,但你需要做的是编写一个围绕 tmux 的包装器(称它mytmux
或其他东西):
- 调用
tmux ls
并解析输出,查找未附加的内容 - 附加到第一个非附加会话,-OR-
- 如果未找到空闲会话,则创建一个会话并附加到该会话
tmux ls
如果有任何会话,该命令应该返回如下内容:
<~> $ tmux ls
0: 1 windows (created Mon Sep 16 21:42:16 2013) [120x34] (attached)
其中,初始字段(“0”)是会话名称,最后一个字段表示是否有人附加到该会话。因此,如果没有人附加,则它将如下所示:
<~> $ tmux ls
0: 1 windows (created Mon Sep 16 21:42:16 2013) [120x34]
如果有些附加了,有些没有,你会得到:
<~> $ tmux ls
0: 1 windows (created Mon Sep 16 21:42:16 2013) [120x34] (attached)
1: 1 windows (created Mon Sep 16 21:43:30 2013) [120x34]
如果找不到任何会话或没有免费会话,请运行tmux new
以创建一个。如果找到免费会话,请运行tmux attach -t 1
,其中“1”是免费会话的名称。
答案3
我还需要“重新使用任何分离的会话或创建一个”功能。这是我的一行代码(如果在会话名称中使用“:”,则会失败):
tmux attach -t $(tmux ls | grep -v attached | head -1 | cut -f1 -d:) || tmux
答案4
OP 的帖子有点令人困惑,但从原始解决方案“tmux a || tmux || bash”中我推断出:附加到现有的或创建新的 =>
tmux ls | grep -v 附加 && tmux 附加 || tmux
会做。
我更喜欢:.profile 中的“如果存在未附加的 tmux 会话,则连接到它,否则使用 shell”:
tmux ls | grep -v 附加 && tmux 附加