864

I learned from somewhere a detached screen can be killed by

screen -X -S [session # you want to kill] kill

where [session # you want to kill] can be gotten from

screen -ls

But this doesn't work. Anything wrong? What's the correct way?

Benjamin W.
  • 46,058
  • 19
  • 106
  • 116
Tim
  • 1
  • 141
  • 372
  • 590

11 Answers11

1266

"kill" will only kill one screen window. To "kill" the complete session, use quit.

Example

$ screen -X -S [session # you want to kill] quit

For dead sessions use: $ screen -wipe

Community
  • 1
  • 1
innaM
  • 47,505
  • 4
  • 67
  • 87
497

You can kill a detached session which is not responding within the screen session by doing the following.

  1. Type screen -list to identify the detached screen session.

    ~$ screen -list  
        There are screens on:  
             20751.Melvin_Peter_V42  (Detached)  
    

    Note: 20751.Melvin_Peter_V42 is your session id.

  2. Get attached to the detached screen session

    screen -r 20751.Melvin_Peter_V42
  3. Once connected to the session press Ctrl + A then type :quit

0xcaff
  • 13,085
  • 5
  • 47
  • 55
Melvin Peter
  • 4,979
  • 2
  • 15
  • 4
145

List screens:

screen -list

Output:

There is a screen on:
23536.pts-0.wdzee       (10/04/2012 08:40:45 AM)        (Detached)
1 Socket in /var/run/screen/S-root.

Kill screen session:

screen -S 23536 -X quit
13ren
  • 11,887
  • 9
  • 47
  • 64
Collin Thomas
  • 1,590
  • 1
  • 13
  • 12
113

It's easier to kill a session, when some meaningful name is given:

//Creation:
screen -S some_name proc
// Kill detached session
screen -S some_name -X quit
Hitman_99
  • 2,252
  • 2
  • 19
  • 21
43

You can just go to the place where the screen session is housed and run:

 screen -ls

which results in

 There is a screen on:
         26727.pts-0.devxxx      (Attached)
 1 Socket in /tmp/uscreens/S-xxx. <------ this is where the session is.

And just remove it:

  1. cd /tmp/uscreens/S-xxx
  2. ls
  3. 26727.pts-0.devxxx
  4. rm 26727.pts-0.devxxx
  5. ls

The uscreens directory will not have the 26727.pts-0.devxxx file in it anymore. Now to make sure just type this:

screen -ls

and you should get:

No Sockets found in /tmp/uscreens/S-xxx.

0xcaff
  • 13,085
  • 5
  • 47
  • 55
rc2012
  • 531
  • 4
  • 2
  • 4
    This is the only solution that will work if the screen is "stuck", ie. not dead, but cannot be attached to. – redreinard Jul 22 '15 at 20:28
  • This helped me when the screen was utterly locked, but I did need to find and kill the actual process as well. `ps aux | grep screen` found the pid and I issued a `kill` to remove it. Depending on what you had running in your screen, you may have temp files and locks to clean up as well. – Lomky Jan 09 '17 at 16:29
29
screen -wipe

Should clean all dead screen sessions.

Goodwine
  • 1,658
  • 1
  • 18
  • 31
Vishv Jeet
  • 319
  • 3
  • 2
  • 11
    What means dead? not running any program? – Shihao Xu Jun 29 '16 at 08:18
  • 1
    @ShihaoXu Dead means the session is unreachable and on localhost (socket connection is broken). - see https://www.gnu.org/software/screen/manual/screen.html – illnr Jun 30 '18 at 07:33
23

add this to your ~/.bashrc:

alias cleanscreen="screen -ls | tail -n +2 | head -n -2 | awk '{print $1}'| xargs -I{} screen -S {} -X quit"

Then use cleanscreen to clean all screen session.

0xcaff
  • 13,085
  • 5
  • 47
  • 55
user2115803
  • 331
  • 2
  • 3
  • 11
    A simple one-liner: `screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill` – Ariel Jul 28 '14 at 17:41
  • 3
    Worked a treat, but had to modify it slightly to work on OSX: `screen -ls | tail +2 | head -2 | awk '{print $1}'| xargs -I{} screen -S {} -X quit` – Jonathan Mar 15 '15 at 04:39
  • Slight improvement:-screen -ls | grep Attached | cut -d. -f1 | awk '{print $1}' | xargs -I{} screen -d {} – Abhay Yadav Jul 18 '15 at 05:22
21

For me a simple

exit

works. This is from within the screen session.

Nick Desaulniers
  • 2,046
  • 3
  • 25
  • 47
16

To kill all detached screen sessions, include this function in your .bash_profile:

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

to run it, call killd

Rose Perrone
  • 61,572
  • 58
  • 208
  • 243
  • 5
    Sometimes it's not 5 digits, so i use: killd () { for session in $(screen -ls | grep -o '[0-9]\+') do screen -S "${session}" -X quit; done } – Kostyantyn May 20 '13 at 11:58
7
== ISSUE THIS COMMAND
[xxx@devxxx ~]$ screen -ls


== SCREEN RESPONDS
There are screens on:
        23487.pts-0.devxxx      (Detached)
        26727.pts-0.devxxx      (Attached)
2 Sockets in /tmp/uscreens/S-xxx.


== NOW KILL THE ONE YOU DONT WANT
[xxx@devxxx ~]$ screen -X -S 23487.pts-0.devxxx kill


== WANT PROOF?
[xxx@devxxx ~]$ screen -ls
There is a screen on:
        26727.pts-0.devxxx      (Attached)
1 Socket in /tmp/uscreens/S-xxx.
duggi
  • 565
  • 7
  • 13
5

Alternatively, while in your screen session all you have to do is type exit

This will kill the shell session initiated by the screen, which effectively terminates the screen session you are on.

No need to bother with screen session id, etc.

dat789
  • 1,923
  • 3
  • 20
  • 26