我已经制作了一个Bash文件,它启动另一个Bash文件并在独立的屏幕上使用唯一的名称,我需要确保任何时候只有一个内部的Bash文件正在运行。为了实现这一点,我希望父级Bash文件在尝试创建屏幕之前检查是否存在该名称的屏幕。是否有一种方法可以做到这一点?
我已经制作了一个Bash文件,它启动另一个Bash文件并在独立的屏幕上使用唯一的名称,我需要确保任何时候只有一个内部的Bash文件正在运行。为了实现这一点,我希望父级Bash文件在尝试创建屏幕之前检查是否存在该名称的屏幕。是否有一种方法可以做到这一点?
您可以使用screen -list
命令的输出进行grep操作,以查找您要检查的会话名称:
if ! screen -list | grep -q "myscreen"; then
# run bash script
fi
grep
的情况下如何检查呢?例如使用screen
命令。假设你想知道是否存在会话“abcd”,但只有会话“abcdefgh”,那么你的条件会返回yes,但实际上会话不存在。 - e271p314grep
命令。grep -q '^abcd$'
只会匹配完全符合的会话名称 'abcd'。 - chepner-Q select myWindow
的想法(也检查特定窗口)...但这种grep方法是通过其他用户的会话进行最简单的检查:if (screen -ls user/ | grep -q '\.mySession\s');
- Hicsy您可以查询特定会话的屏幕“select”命令;如果会话存在,则shell结果为“0”,如果未找到命名的屏幕会话,则为“1”:
$ screen -S Tomcat $ screen -S Tomcat -Q select . ; echo $? 0
相对于:
$ screen -S Jetty -Q select . ; echo $? 未找到屏幕会话。 1
请注意,在 select
后面的 '.'
是可选的,但可能更加健壮。
screen -S Tomcat -Q echo ''; echo $?
也可以工作,但不会触发重绘。 - Lars Schillingmannif (screen -S user/session -Q select myWindow > /dev/null);
.... 有趣的是: -Q
让你检查特定的窗口,而 -X select myWindow
总是像你写了 -X select .
一样行为,无论子窗口如何。另一个有趣的事情是:这些方法也固有地验证多用户会话上的权限,不像 -ls | grep
。 - Hicsy鉴于我不能评论,我将其作为新答案发布。troyfolger的回答是个好主意,基本上意味着尝试向会话发送一个几乎没有任何作用的命令。其中的一个问题是,在某些(较旧的)版本的screen上,-Q不受支持,因此对于这些版本,正确的命令是:
screen -S Jetty -X select . ; echo $?
将命令“select .”发送到名为“Jetty”的屏幕会话。screen -S "TEST"
或者 screen -list "TEST"
命令时,你可能会选择到 "TEST123" 屏幕!GNU screen 实现屏幕名称匹配存在某些问题(非确定性)。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
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"
screen
,不妨考虑尝试一下 tmux。虽然有很多不同之处,但切换到它是值得的。 - jpaugh