119

I need it to determine if hitting ctrl+d would disconnect me from server or just close current screen.

Is it somehow possible to check if I'm right now in screen session?

9 Answers 9

169

You can look at the $STY variable (a variable set by the screen command). If it is not "" then you are in a screen session.

I am in screen

$ echo $STY 
29624.pts-1.iain-10-04
$

I am not in screen

$ echo $STY

$
5
  • 13
    This presumes that you are still within a running session on the local computer. If you start up screen and then SSH somewhere else, this won't work. Commented Apr 11, 2011 at 3:05
  • 2
    if test -n "$STY"; then printf "This is a screen session named '$STY'.\n"; else printf "This is NOT a screen session.\n"; fi Commented Sep 19, 2015 at 17:08
  • 3
    @DavidMackintosh if you're SSH'd into somewhere else, hitting ctrl-D will "disconnect me from server", which is exactly what the question asks about.
    – womble
    Commented Aug 11, 2016 at 8:24
  • 1
    @aggregate1166877 I have this if you posted as an alias in every single machine that I use now. Commented Sep 10, 2016 at 12:32
  • This doesn't work in a sudo script run inside a screen
    – ceztko
    Commented Nov 7, 2021 at 14:14
56

You can look at the $TERM variable.

echo $TERM

If it's a screen session, the term variable should return "screen".

root@deore:/volumes# echo $TERM
screen

Ctrl-a -d (to exit screen)

root@deore:/volumes# echo $TERM
xterm

Also check: https://stackoverflow.com/questions/3472287/how-do-you-tell-if-the-current-terminal-session-is-in-gnu-screen

4
  • 4
    This presumes that you are not deliberately messing with your TERM value for some reason. Commented Apr 11, 2011 at 3:04
  • 1
    If you're changing your TERM variable while inside screen, you're inviting all sorts of trouble on yourself.
    – womble
    Commented Aug 11, 2016 at 8:24
  • Well my Solaris 2.6 nodes don't play nice with TERM values set to screen values. Commented Aug 11, 2016 at 17:56
  • 4
    "$TERM" = "screen" seems to be preserved when entering sudo environment, unlike the $STY option.
    – Melebius
    Commented Dec 13, 2016 at 10:00
39

Unless you have changed the default key bindings, you can do Ctrl+a -> Ctrl+t, which will show the time, if you are in screen. This will work even if you have ssh:d away somewhere else, unlike the other suggestions.

7
  • 4
    Why are we not upvoting this.
    – AndreKR
    Commented Mar 6, 2014 at 2:36
  • 1
    How is this the best solution? What if you're not in screen, and ^A^T is the key sequence for "nuke your homedir" in the program you're currently running?
    – womble
    Commented Aug 11, 2016 at 8:25
  • 4
    @womble If you are in an unknown program that may do random destructive things as a response to key sequences and commands, then nothing is safe.
    – Gurgeh
    Commented Aug 12, 2016 at 8:55
  • 2
    @AndreKR: It doesn't work in a script Commented Jan 19, 2019 at 20:38
  • 1
    im not upvoting because in in a screen, and screening into another screen, and i literally need to see if $STY is even set. which for some reason its coming back empty. Commented Apr 23, 2019 at 1:18
24

The caption command in the ~/.screenrc is a nice way to differentiate a screen session.

I'm personally using this:

$ cat ~/.screenrc
caption always "%{= kc}Screen session on %H (system load: %l)%-28=%{= .m}%D %d.%m.%Y %0c"

It adds a line like this one at the bottom of the screen:

Screen session on gbook (system load: 1,75 1,74 1,68)                   Lun 05.01.2015 13:01

With the first part (system name + load) in green and the date in pink. Useful and hard to miss!

2
  • 2
    This is perfect! It does not get in the way (bottom position), it is always visible (and colored) and provides useful info about system. I posted this here also stackoverflow.com/a/43571028/2450431
    – hrvoj3e
    Commented Apr 23, 2017 at 12:22
  • I'd like to add $STY in it. caption always "%{= kc}Screen $STY on %H (system load: %l)%-28=%{= .m}%D %d.%m.%Y %0c"
    – John Lee
    Commented Dec 22, 2022 at 1:25
7

I have found another solution:
Modify your .screenrc, so my screen session looks completely different from normal terminal.

1
  • I think I know what you're suggesting, and it could in some situations avoid this problem entirely. It might be more helpful if you describe what you mean by showing (e.g.) an example .screenrc file.
    – jvriesem
    Commented Apr 29, 2019 at 18:42
4

Better answer (in my opinion), inspired by this, just type the following:

pstree -s $$

If you get something like this:

systemd───sshd───sshd───bash───screen───screen───bash───pstree

… then you are in screen.

This is true not only for screen, but also for any kind of process (like script, nested bash or other shells) opening a nested shell, and this can even also show nested screen calls (if several not consecutive occurrences exists).

3
  • This would be a good answer but it should be worked on further to allow scripting
    – ceztko
    Commented Nov 7, 2021 at 14:22
  • 1
    Scripting was not asked inside initial question, but if really required: if [[ $(pstree -s $$) =~ screen ]] ; then echo 'yes' ; else echo 'no' ; fi
    – GingkoFr
    Commented Nov 8, 2021 at 15:40
  • I would suggest [[ $(pstree -sA $$) =~ ---screen--- ]], this will reduce the risk of a false positive.
    – Glushiator
    Commented Jun 10, 2022 at 15:25
0

If you are looking at a command line prompt, you can just type something, anything, and hit Ctrl+A. If your cursor jumps to the beginning of the prompt, you're not inside a screen. If you additionally have to hit A, then you are.

-1

Do a screen -ls. It's going to explicitly indicate Attached versus Detached status.

Example attached:

$ screen -ls | grep tached
3132.pts-0.esavo00      (Attached)

Example detached:

$ screen -ls |grep tached
3132.pts-0.esavo00  (Detached)
1
  • 7
    if there are screens attached somewhere else this might be an issue. Commented Apr 29, 2015 at 9:15
-1
screen -ls

to view your sessions and

screen -r sessioninfo

to reconnect to a disconnected one, if detached.

screen -D -r sessioninfo

to reconnect to a disconnected one.

1
  • 2
    This doesn't answer the question.
    – womble
    Commented Aug 11, 2016 at 8:22

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .