107

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?

Pro Backup
  • 914
  • 4
  • 15
  • 33
wlk
  • 1,643
  • 3
  • 14
  • 19

9 Answers9

143

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

$
rogerdpack
  • 575
  • 2
  • 8
  • 22
user9517
  • 114,104
  • 20
  • 206
  • 289
  • 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. – David Mackintosh Apr 11 '11 at 03: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` – aggregate1166877 Sep 19 '15 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 Aug 11 '16 at 08:24
  • 1
    @aggregate1166877 I have this if you posted as an alias in every single machine that I use now. – Eduardo Bezerra Sep 10 '16 at 12:32
  • This doesn't work in a `sudo` script run inside a screen – ceztko Nov 07 '21 at 14:14
51

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

ewwhite
  • 194,921
  • 91
  • 434
  • 799
35

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.

mature
  • 161
  • 2
  • 11
Gurgeh
  • 443
  • 4
  • 3
22

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!

Gaëtan Lehmann
  • 321
  • 2
  • 3
  • 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 http://stackoverflow.com/a/43571028/2450431 – hrvoj3e Apr 23 '17 at 12:22
7

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

wlk
  • 1,643
  • 3
  • 14
  • 19
  • 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 Apr 29 '19 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).

GingkoFr
  • 53
  • 4
  • This would be a good answer but it should be worked on further to allow scripting – ceztko Nov 07 '21 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 Nov 08 '21 at 15:40
  • I would suggest `[[ $(pstree -sA $$) =~ ---screen--- ]]`, this will reduce the risk of a false positive. – Glushiator Jun 10 '22 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
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.

Kevin
  • 1