863
votes

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?

5
  • 25
    "somewhere" is not always a good source of information. Try "man screen". Commented Oct 2, 2009 at 14:08
  • 27
    The correct command is screen -S sessionname -p 0 -X quit Commented Aug 29, 2013 at 2:27
  • killall -# screen [# = number of screens you want to kill] Commented Aug 29, 2014 at 14:14
  • I simply use exit Commented Feb 16, 2018 at 13:15
  • CTRL + D when in screen is the easiest command. Commented Mar 28, 2019 at 17:50

11 Answers 11

1265
votes

"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

Sign up to request clarification or add additional context in comments.

7 Comments

type 'exit' (without the quotes) in ubuntu :P
exit works but needs to be typed into each screen that was opened. quit does not even work
@kapad actually quit works if you write it inline -X -S pid/sockname quit
on OSX entering screen -X quit on any terminal terminates all active sessions
Ctrl + D also works
|
497
votes

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

4 Comments

you can just use screen -r 20751 without the full name
or: Ctrl + a, k
@laffuste 's comment worked for me, but quit and :quit lead to command not found on my remote Linux server (perhaps differences between versions of the OS or screen are to blame)
once attached to the screen, exit also works
145
votes

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

1 Comment

'screen -ls' also works. ;)
113
votes

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

2 Comments

Why screen -S and not screen -r?
This answer uses the name of the session, which is way more convenient than looking up the ID. Thank You!
43
votes

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.

2 Comments

This is the only solution that will work if the screen is "stuck", ie. not dead, but cannot be attached to.
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.
29
votes
screen -wipe

Should clean all dead screen sessions.

2 Comments

What means dead? not running any program?
@ShihaoXu Dead means the session is unreachable and on localhost (socket connection is broken). - see gnu.org/software/screen/manual/screen.html
23
votes

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.

3 Comments

A simple one-liner: screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
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
Slight improvement:-screen -ls | grep Attached | cut -d. -f1 | awk '{print $1}' | xargs -I{} screen -d {}
21
votes

For me a simple

exit

works. This is from within the screen session.

3 Comments

also, ctrl+a :quit
also, ctrl+a, then K
Or just CTRL+D within a screen
16
votes

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

1 Comment

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 }
7
votes
== 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.

2 Comments

Wouldn't that just remove the socket, not kill the process behind it?
Is this method is risky from the point of view of creation of zomby processes ?
5
votes

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.