杀死所有已分离的屏幕会话

68
当我执行screen -ls时,会看到以下内容。怎样才能杀死所有已分离的会话?
There are screens on:
        84918.ttys002.ros-mbp   (Detached)
        84944.ttys008.ros-mbp   (Detached)
        84970.ttys013.ros-mbp   (Attached)
        84998.ttys002.ros-mbp   (Detached)
        85024.ttys002.ros-mbp   (Detached)
5 Sockets in /var/folders/86/062qtcyx2rxbnmn8mtpkyghs0r0r_z/T/.screen.

1
可能是终止已分离的屏幕会话的重复问题。 - Léo Léopold Hertz 준영
2
我已经转换到 tmux,它是 screen 的更好版本。 - Rose Perrone
6个回答

111

screen -ls | grep pts | cut -d. -f1 | awk '{print $1}' | xargs kill

关闭 已分离的 screen 会话(感谢 @schatten):

screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill


40
好的解决方案,谢谢。但它也会终止附加的会话。 我使用了这个命令: screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill - schatten
@schatten,您能否逐个管道解释该命令的工作原理? - easytarget
7
@MusséRedi screen -ls 命令不会启动一个新的 screen,它列出所有已存在的 screen 会话;grep Detached – 在前面输出中,被断开连接(detached)的会话以 'Detached' 标记;cut -d. -f1 – 将每个字符串按 "."(-d.)分割,并选择仅第一部分 (-f1),这样我们就只有可能带有前导空格的进程 ID(pid);awk {print $1} – 它读取输入行并通过空格进行拆分,因此在这种情况下,它只是删除了前导空格;xargs kill – 从标准输入读取参数并运行 kill 命令,因此对于每一行,您都将获得一个 kill <pid> 命令。 - schatten
2
如果您使用的是Linux系统而非苹果电脑,您需要运行以下命令以避免出现错误:screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs -r kill。这个命令可以防止在没有当前屏幕运行时出现错误(特别适用于bash脚本)。 - Richard
太棒了,运行得非常完美! - phi

28

这里有一个综合了所有答案的解决方案:将以下内容添加到你的.bashrc或者.bash_profile文件中:

killscreens () {
    screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
}
  • 这是一个方便易记的函数
  • 只杀死已分离的屏幕,以防止您做出愚蠢的事情
  • 记得打开一个新的bash终端或运行source .bashrc以使killscreens可用

感谢@Rose Perrone、@Milind Shah和@schatten


11

将此函数包含在您的 .bash_profile 文件中:

killd () {
    for session in $(screen -ls | grep -o '[0-9]\{4\}')
    do
        screen -S "${session}" -X quit;
    done
}
要运行它,请调用killd。这将杀死所有已分离或未分离的屏幕会话。

3
应该是 '[0-9]\{3,\}' - Flimm
优雅的解决方案,这是一个很好的拥有。 - Arash Saidi

3
将Edward Newell和Rose Perrone的解决方案结合起来,形成更易读、更像屏幕显示的解决方案。
将以下内容添加到您的.bashrc.bash_profile文件中。
# function for killing all detached screen sessions
killds() {
    detached_sessions=$(screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}')
    for s in ${detached_sessions}
    do
        screen -S "${s}" -X quit;
    done
}

1

If the screens are dead, use:

screen -wipe

0
'[0-9]\{3,\}'

在...的情况下

There is a screen on:
20505.blabla    (03/05/2014 22:16:25)   (Detached)
1 Socket in /var/run/screen/S-blabla.

将匹配20505和2014,其中退出2014将返回“未找到任何屏幕会话。”

[0-9]\{3,\}\.\S*

可能可行。

我经常遇到模式20505。名称,其中名称是主机名或如果使用-S标志启动屏幕,则为会话名。适用于OS X和Debian,可能不是普遍的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接