Send commands or input to a detached screen session
Published: 02-10-2019 | Author: Remy van Elst | Text only version of this article
❗ This post is over two years old. It may no longer be up to date. Opinions may have changed.
This snippet will show you how to send commands to a running screen session. This includes actual shell commands or keyboard input, as well as screen commands, for example to set a logfile.
As I'm writing this article, I notice that today screen 4.7.0 is released.
Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.
You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $100 credit for 60 days.
screen commands vs shell commands (input)
For my recent article on serial port data I figured out how to send a command to a running but detached screen session. This was a screen command, not a shell command.
screen commands are the same things as what you would put in a
file or inside a screen session via
CTRL+A :. For example, the command
tells screen to log the output to a text file named
Shell commands are things you type in your terminal. Both commands like
or keyboard shortcuts like
You can start a detached screen session with the following command:
screen -dmS sessionName [command-to-run]
With the command
you can view all screen sessions and with either
screen -r or
screen -x you
can reattach to a session.
Sending commands to screen
As explained above, there is a difference between shell commands and screen commands.
screen has the
-X flag which allows you to send a (screen) command to a session.
To send a screen command to a session:
screen -S sessionName -p 0 -X screen command
-p 0 flag is for the window inside screen. If you have created multiple
CTRL+A c) you can specify the number. With
CTRL+A [0-9] you can
directly go to that window inside screen.
For screen commands, after the
-X flag you don't need quotes. So for the logfile
screen -S sessionName -p 0 -X logfile filename.txt
For shell commands or keyboard input, we need to use the screen command
If you have a running screen session and you want to send the
screen -S sessionName -p 0 -X stuff "ls^M"
stuff you do need quotes. The
^M is the keycode the
sends to the terminal. If you omit it, screen will just type
ls onto your terminal
but not send the
ENTER key afterwards.
To send a
CTRL+C to a session (e.g. to stop a running interactive process):
screen -S sessionName -p 0 -X stuff "^C"
If you need to find out what keycode a specific key sends, in bash you can
CTRL+V and then the special key. The
PGDOWN key for example:
More documentation on the
stuff command can be found here.