检查是否存在指定名称的屏幕



我制作了一个bash文件,该文件在分离的屏幕中以唯一的名称启动另一个bash文件,我需要确保在任何一个时间点都只有该内部bash文件的一个实例在运行。要做到这一点,我想在尝试创建该名称的屏幕之前,先检查父bash文件,看看它是否存在。有什么方法可以这样做吗?

您可以为要检查的会话的名称生成screen -list的输出:

if ! screen -list | grep -q "myscreen"; then
    # run bash script
fi

您可以查询特定会话的屏幕"选择"命令;如果会话存在,shell结果为"0",如果找不到命名的屏幕会话,则为"1":

$screen-S Tomcat$screen-S Tomcat-Q选择;echo$?0

对比:

$screen-S Jetty-Q选择;echo$?找不到屏幕会话。1.

注意,select之后的'.'是可选的,但可能更健壮。

鉴于我无法发表评论,我将此作为新答案发布。triyflger的答案是一个好主意,基本上相当于尝试向会话发送一个几乎没有作用的命令。一个问题是,对于某些(旧)版本的screen-Q不受支持,因此对于这些版本,正确的命令是

screen -S Jetty -X select . ; echo $?

将命令"select."发送到名为"Jetty"的屏幕会话。

选择更改激活的窗口和。表示当前活动窗口,因此这意味着尝试将活动窗口更改为当前活动窗口。只有当没有我们想要连接的会话时,这才会失败。

如果你阅读的信息文档比它建议的唯一使用选择。使用-X作为测试或确保选择了某些内容。

所有提出的解决方案都不处理没有唯一模式的屏幕名称,例如"TEST"one_answers"TEST123"。当您screen -S "TEST"screen -list "TEST"时,您可能会发现自己选择了屏幕"TEST123"!GNU屏幕实现屏幕名称匹配的方式有一些错误(不确定性)。

下面是一个bash函数,它试图进行精确匹配,并返回PID.SCREEN NAME和退出代码:

function find_screen {
    if screen -ls "$1" | grep -o "^s*[0-9]*.$1[ "$'t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*.$1" --color=NEVER -m 1 -q >/dev/null; then
        screen -ls "$1" | grep -o "^s*[0-9]*.$1[ "$'t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*.$1" --color=NEVER -m 1 2>/dev/null
        return 0
    else
        echo "$1"
        return 1
    fi
}

用法-选择屏幕:

target_screen=$(find_screen "SCREEN NAME")
screen -S "$target_screen" ...etc...

用法-测试屏幕是否存在:

if find_screen "SCREEN NAME" >/dev/null; then
    echo "Found!"
fi

无论如何,这将涵盖99,9%的病例。要确定99,99%,请在屏幕名称中转义grep特殊字符。完美匹配需要grep将整行匹配到$,包括括号中的日期,该日期可能会随着版本的变化而变化。另一种完美匹配方法是:

ls -A -1 /var/run/screen/S-${USER} | grep "^[0-9]*.SCREEN NAME$"

但这很难,我们需要确保屏幕实现使用这个文件夹。我不推荐最后一种方法。

一个更简单的方法是:

screen -xR -S SessionName

复制自Stéphane Chazelas的评论:

如果没有附加内容,我通常使用-xR来附加或创建。

因此,您不必搜索会话名称是否已经存在,如果会话存在,此方法将附加到会话,如果不存在,则它将创建会话。

<100工时。>
screen -list | grep "SESSİON NAME" && echo "Active Program" || echo "Passive Program"

相关内容

  • 没有找到相关文章

最新更新