我已经创建了一个bash文件,它在一个独立的屏幕中使用唯一的名称启动另一个bash文件,我需要确保在任何一个时间点上只有一个内部bash文件的实例在运行。为此,我想让父bash文件在尝试创建该文件之前检查该名称的屏幕是否存在。有什么方法可以做到这一点吗?
发布于 2012-09-04 08:35:18
您可以使用grep命令将screen -list的输出转换为要检查的会话的名称:
if ! screen -list | grep -q "myscreen"; then
# run bash script
fi发布于 2015-02-26 00:30:24
鉴于我无法评论,我将此作为新的答案发布。troyfolger的回答是一个好主意,基本上相当于尝试向会话发送一个几乎没有什么作用的命令。一个问题是,对于某些(旧)版本的screen -Q不受支持,因此对于这些版本,正确的命令是
screen -S Jetty -X select . ; echo $?它发送命令"select“。添加到名为"Jetty“的屏幕会话中。
选择更改哪个窗口处于活动状态,然后。表示当前活动窗口,因此这意味着尝试将活动窗口更改为当前活动窗口。只有当没有我们想要连接的会话时,这才会失败。
如果你看了信息文档,那就建议你只使用select。使用-X作为测试或确保选择了某些内容。
发布于 2015-10-18 07:33:37
所有提出的解决方案都不处理没有唯一模式的屏幕名称,例如“测试”和"TEST123“。当你screen -S "TEST"或screen -list "TEST"时,你可能会发现自己选择了屏幕"TEST123"!GNU screen实现屏幕名称匹配的方式存在错误(不确定)。
下面是一个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...Usage -测试屏幕是否存在:
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实现使用这个文件夹。我不推荐最后一种方法。
https://stackoverflow.com/questions/12255388
复制相似问题