我有一个shell脚本,如果它存在,它应该杀死一个分离的屏幕会话。脚本是
if ! screen -list | grep -q "ScreenName"; then
screen -S ScreenName -X quit
fi
不幸的是,当我运行脚本并且屏幕会话不存在时,屏幕-S ... -X quit命令似乎始终运行bc它仍然输出“未找到屏幕会话”。当我删除!并且屏幕会话正在运行,它不会终止正在运行的会话。
问题是什么?感谢
答案 0 :(得分:6)
要删除“未找到屏幕会话”消息,请重定向screen
的stderr:
screen -list 2>/dev/null
接下来,请记住,如果会话受密码保护,则-X
不起作用。
然后,使用-r
让screen
知道您只想杀死分离的会话,而且不再需要grep
和if
。
全部放在一起:
screen -r -S "ScreenName" -X quit 2>/dev/null
答案 1 :(得分:4)
grep对返回码有一个令人困惑的约定。找到字符串时返回0,没有匹配时返回1。你应该省略!在这种情况下。
答案 2 :(得分: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
列出会话,所有输出到stdout grep '(Detached)'
过滤分离的会话grep -o 'ScreenName'
过滤ScreenName并仅输出ScreenName xargs -I{} -n 1 -r screen -r -S {} -X quit
一次一个地运行xargs -n 1
输出,-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>