60

The "screen" refers to a program mentioned in How to reconnect to a disconnected ssh session . That is a good facility.

But there is a question I'd really like to know. How do I know whether I'm running inside a "screen"? The difference is:

  • If yes, I know I can safely close current terminal window, e.g., close a PuTTY window, without losing my shell(Bash etc) session.
  • If no, I know I have to take care of any pending works before I close the terminal window.

Better, I'd like this status to be displayed in PS1 prompt so that I can see it any time automatically.

4
  • 3
    If you use tmux instead of screen, you get a little status bar by default. They're pretty much the same for basic usage. Apr 6, 2012 at 20:35
  • 9
    Place your totem on the table, and let it spin. If it keeps spinning, you're OK. Else you're in a screen :]
    – Konerak
    Apr 7, 2012 at 11:09
  • You can also use byobu with screen and tmux. It can be setup to load automatically at login and then hitting F6 key disconnects and logs out.
    – mp3foley
    Apr 12, 2012 at 20:58
  • Possible duplicate of How to check if I'm in screen session? Feb 14, 2018 at 21:48

7 Answers 7

89

(Stolen from "How can I tell whether I'm in a screen?" over on StackOverflow and authored by user jho. P.S. You can't vote for a duplicate across StackExchange sites.)

Check $STY. If it's null, you're on a "real" terminal. If it contains anything, it's the name of the screen you're in.

If you are not in screen:

eric@dev ~ $ echo $STY
eric@dev ~ $ 

If you are in screen:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71

If you use tmux instead of screen, also check $TMUX. To add this to your prompt, add the following to your ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi
1
  • 3
    if you run something via sudo it by default won't inherit environment variables, including $STY. But $TERM is typically propagated to the sudo environment, so maybe check for either $STY or $TERM=="screen"
    – rcoup
    Aug 15, 2017 at 7:19
15

Look for $STY which provides details that screen uses to communicate with itself; $WINDOW will then be the current screen window number.

13

The simple check I usually use is to just hit Ctrl-a:

  • If the cursor jumps to the start of the line, I'm not inside a screen session.

  • If nothing happens, I know that I'm inside a screen session and that I've just used the screen control key. I then hit a (jump to the beginning of the line), w (show current screen windows) or execute some other "harmless" screen command to get back to the command prompt.

(Of course, this only works if you are currently executing bash or some other piece of software that "jumps to the start of the line" or does something equivalently harmless when hitting Ctrl-a.)

3
  • 3
    This only works if your screen control key is left at the default Ctrl-a, of course. Apr 6, 2012 at 12:53
  • 1
    hitting control key + DD would detach and terminate ssh. You can hit that combination for more convenience Apr 6, 2012 at 14:14
  • While the answer is fine for the actual question, this method is not scriptable. Dec 2, 2014 at 11:08
7

Well, most of the time (absent someone's attempts to screw with things) your TERM will be set to screen (or at least mention screen somewhere).

The easy solution to the problem is just run screen everywhere. Don't leave home without it, I say.

1
  • $TERM also typically propagates through sudo, which is a plus!
    – rcoup
    Aug 15, 2017 at 7:19
7

I keep this in my .bashrc:

 PS1='[\u@\h \W'
 if [ "$WINDOW" ]; then PS1="$PS1 ($WINDOW)"; fi
 PS1="$PS1]$"

It's not foolproof, but whenever I create a new screen, it puts the window number in the prompt. If I'm not running screen, there's no number.

3

I have an even cooler way.

Add the following to your ~/.screenrc and you'll see a status line down the bottom (showing in inverted text the date, time and system load. More escape codes found in man page link below.

    hardstatus alwayslastline
    hardstatus string '%Y-%m-%d %c | %l'

Source this when in a screen session with ctrl-a:source ~/.screenrc.

I have to thank Kyle Rankin of Linux Journal for this. See his fantastic article at http://www.linuxjournal.com/article/10950. The man page section he refers to can be found at http://www.gnu.org/software/screen/manual/screen.html#String-Escapes.

2

you could also recurse up the process tree from $$ to see if you find a screen instance. the exact chain will probably depend on your setup--on my OS X box, a zsh inside screen has login as its parent, SCREEN as its grandparent, and screen as its great-grandparent.

You must log in to answer this question.

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