如果屏幕存在则运行命令

时间:2013-08-29 17:10:23

标签: bash shell gnu-screen

我有一个shell脚本,如果它存在,它应该杀死一个分离的屏幕会话。脚本是

if ! screen -list | grep -q "ScreenName"; then
  screen -S ScreenName -X quit
fi

不幸的是,当我运行脚本并且屏幕会话不存在时,屏幕-S ... -X quit命令似乎始终运行bc它仍然输出“未找到屏幕会话”。当我删除!并且屏幕会话正在运行,它不会终止正在运行的会话。

问题是什么?感谢

3 个答案:

答案 0 :(得分:6)

要删除“未找到屏幕会话”消息,请重定向screen的stderr:

screen -list 2>/dev/null

接下来,请记住,如果会话受密码保护,则-X不起作用。

然后,使用-rscreen知道您只想杀死分离的会话,而且不再需要grepif

全部放在一起:

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
  1. screen -ls 2>&1列出会话,所有输出到stdout
  2. grep '(Detached)'过滤分离的会话
  3. grep -o 'ScreenName'过滤ScreenName并仅输出ScreenName
  4. xargs -I{} -n 1 -r screen -r -S {} -X quit一次一个地运行xargs -n 1输出,-r如果没有输出则不运行,-I{}使用{}作为替换位置你的论点,因为它不在最后,并运行你的命令
  5. 代码示例:

    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>