![如何在不知道 tty 号码的情况下附加 gnu 屏幕](https://linux22.com/image/48841/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E7%9F%A5%E9%81%93%20tty%20%E5%8F%B7%E7%A0%81%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E9%99%84%E5%8A%A0%20gnu%20%E5%B1%8F%E5%B9%95.png)
启动多个 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,d
ssh 登录 shell 关闭。如果再次发出相同的命令,它将重新连接到现有屏幕。$exefile
可以使用不同名称的多个屏幕会话,并且可以独立地重新连接。其神奇之处在于sed
,它会在 的输出中搜索screen -list
与模式匹配的名称[tty].name
。请注意,如果屏幕名称包含sed
特殊字符,则可能需要对其进行转义。