我使用以下命令创建了一个屏幕会话:
screen -t name
根据此名称,有什么方法可以重新打开此会话(假设没有重复的名称)?
答案1
我认为除了查看进程列表之外没有任何选择:
screen -r $(pgrep -f '\<SCREEN.* -t name\>')
在 *BSD 上需要一些不同的东西:
screen -r $(pgrep -t- -f '\<screen.* -t name\>')
选项-t-
指示pgrep
它仅匹配没有控制终端的进程,在这种情况下,仅匹配screen
后端进程,而不是第一个附加的显示(确实将后端进程的screen
更改为到处,但在 *BSD 上,对字符串的更改不会镜像在进程列表中,它们在 Linux 上的方式)。argv[0]
"SCREEN"
argv
在 FreeBSD 上,-a
可能还需要选项(“也匹配调用进程的祖先”)。不幸的是,pgrep -t-
它在 Linux 上不受支持,并且pgrep -a
执行完全不同的操作。
因此,将所有内容放入一个函数中:
# usage tscreen title [args ...]
tscreen(){
title=$1; shift
screen -r $(
pgrep -f "\\<SCREEN.* -t $title\\>" ||
pgrep -t- -f "\\<screen.* -t $title\\>" ||
pgrep -at- -if "\\<screen.* -t $title\\>" ||
echo "title=$title"
) "$@"
}
答案2
您需要做的就是在命令行上使用会话名称作为参数:
screen -r SESSIONNAME
如果有多个具有相同会话名称的屏幕,则还需要指定 PID,如下所示:
[jenny@sameen ~]$ screen -r test1
There are several suitable screens on:
23669.test1 (Detached)
23594.test1 (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
[jenny@sameen ~]$ screen -r 23669.test1
这已在 RHEL7 上的屏幕 4.01.00devel 和 BSD 上的屏幕 4.04.00 中得到验证。