我有一个 shell 脚本,如果它存在,它应该杀死一个分离的屏幕会话。脚本是
if ! screen -list | grep -q "ScreenName"; then
screen -S ScreenName -X quit
fi
不幸的是,当我运行脚本并且屏幕会话不存在时,屏幕 -S ... -X quit 命令似乎总是运行 bc,它仍然输出“未找到屏幕会话”。当我删除!并且屏幕会话正在运行,它不会终止正在运行的会话。
问题可能是什么?谢谢
我有一个 shell 脚本,如果它存在,它应该杀死一个分离的屏幕会话。脚本是
if ! screen -list | grep -q "ScreenName"; then
screen -S ScreenName -X quit
fi
不幸的是,当我运行脚本并且屏幕会话不存在时,屏幕 -S ... -X quit 命令似乎总是运行 bc,它仍然输出“未找到屏幕会话”。当我删除!并且屏幕会话正在运行,它不会终止正在运行的会话。
问题可能是什么?谢谢
要摆脱“未找到屏幕会话”消息,请重定向以下标准错误screen
:
screen -list 2>/dev/null
接下来,请记住,-X
如果会话受密码保护,这将不起作用。
然后,-r
用来让screen
知道您只想终止分离的会话,并且不再需要grep
and if
。
把它们放在一起:
screen -r -S "ScreenName" -X quit 2>/dev/null
grep 对返回码有一个令人困惑的约定。找到字符串时返回 0,没有匹配时返回 1。你应该省略 ! 在条件。
@Sir Athos 的回答非常好,如果您不想忽略有效的错误,或者只是想在将来有更多的方法来做事,您可以以此作为参考:
screen -ls 2>&1 | grep '(Detached)' | grep -o 'ScreenName' | xargs -I{} -n 1 -r screen -r -S {} -X quit
screen -ls 2>&1
列出会话,所有输出到标准输出grep '(Detached)'
过滤分离的会话grep -o 'ScreenName'
筛选 ScreenName 并仅输出 ScreenNamexargs -I{} -n 1 -r screen -r -S {} -X quit
-n 1
一次通过 xargs 运行输出,-r
如果没有输出则不要运行,-I{}
使用 {} 作为参数的替换位置,因为它不在末尾,然后运行您的命令代码示例:
evan> screen -ls
There are screens on:
15491.pts-2.x (08/29/2013 10:43:53 AM) (Detached)
31676.pts-41.x (08/28/2013 10:55:00 AM) (Attached)
2 Sockets in /var/run/screen/S-evan.
evan> screen -ls 2>&1 | grep '(Detached)' | grep -o '15491.pts-2.x' | xargs -I{} -n 1 -r screen -r -S {} -X quit
evan> screen -ls
There is a screen on:
31676.pts-41.x (08/28/2013 10:55:00 AM) (Attached)
1 Socket in /var/run/screen/S-evan.
evan> screen -ls 2>&1 | grep '(Detached)' | grep -o '15491.pts-2.x' | xargs -I{} -n 1 -r screen -r -S {} -X quit
evan>