【问题标题】:Run command if screen exists如果屏幕存在则运行命令
【发布时间】:2013-08-29 17:10:23
【问题描述】:

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

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

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

可能是什么问题?谢谢

【问题讨论】:

  • 如果你拿出!,它对我有用。您确定您使用的网名正确吗?
  • ! 肯定是错误的;如果命名会话不存在,它将指示shell 运行主体。当您删除!,运行给定的命令,然后再次运行screen -list,您的会话是否仍然出现?
  • 这次似乎可以去掉刘海了……但我之前试过了,但没用。网名肯定有区别,因为我想不出其他原因

标签: bash shell gnu-screen


【解决方案1】:

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

screen -list 2>/dev/null

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

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

把它们放在一起:

screen -r -S "ScreenName" -X quit 2>/dev/null

【讨论】:

  • 我喜欢这个作为对我的 kill 声明的一个很好的改进
【解决方案2】:

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

【讨论】:

  • 这解决了这个问题,虽然我之前尝试过,无论出于何种原因,它都不起作用。在为测试创建它时,我一定是输入了错误的屏幕名称(它相当长)。
【解决方案3】:

@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 通过 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>  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多