Kill all detached screen sessions
Asked Answered
K

6

68

When I execute screen -ls, I see the following. How can I kill all the detached sessions?

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.
Knickers answered 21/1, 2013 at 21:0 Comment(2)
possible duplicate of Kill detached screen sessionMagnetic
I've since switch to tmux, which is a better version of screen.Knickers
A
112

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

Kill only Detached screen sessions (credit @schatten):

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

Alurd answered 20/6, 2013 at 3:58 Comment(4)
Good solution, thanks. But it also kills attached session. I used this one screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs killGramnegative
@Gramnegative Could you explain the working of the command separately per pipe?Galatia
@MusséRedi screen -ls – does not start a new screen, but lists all screen sessions; grep Detached – detached sessions are marked as 'Detached' in the previous output; cut -d. -f1 - splits every string by "."(-d.) and then select only the first part (-f1), this way we have only pid with possible leading spaces; awk {print $1} – it reads the input line and splits it by spaces, so basically in this case it just removes leading spaces; xargs kill – runs kill cmd with appended arguments from stdin, so for every line you would get a kill <pid>.Gramnegative
If you're on a Linux box, not Apple, you'll need screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs -r kill to prevent the command erroring if there are no current screens running (especially useful in bash scripts)Hellespont
O
28

Here's a solution that combines all the answers: Add this to your .bashrc or .bash_profile:

killscreens () {
    screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
}
  • this is a convenient function, easy to remember
  • kills only the detached screens, to stop you from doing something dumb
  • remember to open a new bash terminal or run source .bashrc to make killscreens available

Thanks to @Rose Perrone, @Milind Shah, and @schatten

Observant answered 12/5, 2014 at 17:16 Comment(0)
K
11

Include this function in your .bash_profile:

killd () {
    for session in $(screen -ls | grep -o '[0-9]\{4\}')
    do
        screen -S "${session}" -X quit;
    done
}

To run it, call killd. This will kill all screen sessions, detached or not.

Knickers answered 21/1, 2013 at 21:0 Comment(2)
That should be '[0-9]\{3,\}'Baldhead
Elegant solution, one that is goo dto haevMclaren
K
3

Combining Edward Newell's and Rose Perrone's solutions into a more readable and "screen" like solution.

Add below to your .bashrc or .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
}
Kinnon answered 20/3, 2019 at 15:27 Comment(0)
L
1

If the screens are dead, use:

screen -wipe
Lindblad answered 29/3, 2017 at 17:54 Comment(0)
S
0
'[0-9]\{3,\}'

in case of

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

will match both 20505 and 2014, where quitting 2014 will return "No screen session found."

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

might work.

I've always encountered pattern 20505.name, where name is either host name or session name if screen was launched with -S flag. Works on OS X and Debian, might not be universal.

Surrejoinder answered 3/5, 2014 at 20:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.