1

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

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

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

问题可能是什么?谢谢

4

3 回答 3

6

要摆脱“未找到屏幕会话”消息,请重定向以下标准错误screen

screen -list 2>/dev/null

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

然后,-r用来让screen知道您只想终止分离的会话,并且不再需要grepand if

把它们放在一起:

screen -r -S "ScreenName" -X quit 2>/dev/null
于 2013-08-29T17:37:01.077 回答
4

grep 对返回码有一个令人困惑的约定。找到字符串时返回 0,没有匹配时返回 1。你应该省略 ! 在条件。

于 2013-08-29T17:51:42.500 回答
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列出会话,所有输出到标准输出
  2. grep '(Detached)'过滤分离的会话
  3. grep -o 'ScreenName'筛选 ScreenName 并仅输出 ScreenName
  4. xargs -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>  
于 2013-08-29T18:01:06.490 回答