如何在不知道 tty 号码的情况下附加 gnu 屏幕

如何在不知道 tty 号码的情况下附加 gnu 屏幕

启动多个 gnu screen 会话后

screen -S name1
screen -S name2

我想选择性地依附于它们。如果我做

screen -D -R name1

它不会附加而是打印:

There are several suitable screens on:
    6799.name1        (08.02.2013 15:47:23)   (Detached)
    3661.name2        (08.02.2013 13:43:25)   (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

如果我输入:

screen -D -R 6799.name1

但我想在不知道 tty 号码的情况下附加,因为我想通过一个以名称作为参数的脚本启动屏幕会话。此时不知道 tty 号码,每当我稍后想要重新连接时,我都需要手动复制该号码。

一个明显的解决方案是使用字符串操作从上面的屏幕输出中提取 tty 编号。但这似乎有点尴尬。有没有办法告诉 screen 附加到特定的命名会话,无论 tty 号码是什么?

[-d|-D] [-r|-R]请注意,我尝试了手册页中提到的不同组合。


添加注释:

我使用 ssh 在脚本中创建单独的屏幕会话

ssh -t ${host} "
    screen -S \"$exefile\" -t \"$exefile\" -R "nice -n$prio \"$exefile\" ${exeparams[@]}"; 
    exit 0";

后来我尝试使用连接

ssh -t ${host} "
    screen -D -R -S \"$exefile\" && 
    echo \"finished.\"; 
    exit";

其中$exefile是可执行文件的名称和我想要连接的屏幕会话。

答案1

因为我是唯一连接到我的screen会话的人,有时我希望一次将多个控制台连接(多显示模式)到一个会话,所以我使用该-x开关。

# screen -S hosts
# screen -ls
  There is a screen on:
      12828.hosts     (Detached)
  1 Socket in /var/run/screen/S-uther.
# screen -x hosts

man 1 screen

   -x   Attach  to a not detached screen session. 
       (Multi display mode).Screen refuses to attach 
       from within itself.  But when cascading multiple 
       screens, loops are  not  detected; take care.

答案2

这应该有效:

screen -S name1 -D -R

答案3

我发现的唯一可靠的解决方案是问题中概述的暴力方法。要通过 ssh 连接到$exefile远程上具有名称的现有屏幕$host,或者如果不存在则创建一个新屏幕,可以使用(在 bash shell 中):

ssh -t $host "
    echo \"done.\" &&
    echo \"itentifying screen ...\" &&
    myscreen=\`screen -list | sed -n \"s/^\\s*\\s\\([0-9]*\\.$exefile\\)\\s\\s*.*$/\\1/p\"\` &&
    if [ "X\$myscreen" = "X" ]; then 
        echo \"no existing screen session found, creating new\"; 
        screen -S \"$exefile\"; 
    else 
        echo \"connecting to screen \$myscreen\"; 
        screen -d -r \"\$myscreen\"; 
    fi &&
    echo \"finished.\";
    exit";

第一次运行将在 上创建一个新会话$host。如果屏幕分离,则Ctrl+a,dssh 登录 shell 关闭。如果再次发出相同的命令,它将重新连接到现有屏幕。$exefile可以使用不同名称的多个屏幕会话,并且可以独立地重新连接。其神奇之处在于sed,它会在 的输出中搜索screen -list与模式匹配的名称[tty].name。请注意,如果屏幕名称包含sed特殊字符,则可能需要对其进行转义。

相关内容