You probably familiar with manipulating screen operations in your screen sessions. How about “outside” the screen session? Here are some tips about it. If you’re interested, please have a look.

Manipulate Screen from Outer Space

Create screen session with a window running specified command:

$ screen -dmS testing -t shell bash

Turn on log:

$ screen -S testing -pshell -X logfile "/tmp/screen-pshell.log"
$ screen -S testing -pshell -X log on

Run command:

$ screen -S testing -pshell -X stuff 'ping 8.8.8.8\015'

Take a peek at screen window:

$ screen -S testing -pshell -X hardcopy $(tty)

Create new window in the screen session:

$ screen -S testing -X screen -t monitoring bash

Run command in previously created window:

$ screen -S testing -pmonitoring -X stuff 'htop\015'

Terminate foreground running process through keyboard interrupt:

$ screen -S testing -pshell -X stuff '\003'

Kill specific window of the screen:

$ screen -S testing -pshell -X kill

Quit entire screen Session:

$ screen -S testing -X quit

Okay, the aforementioned skills are useful enough. But why should I use them? Under what circumstances should I create a new window inside specific screen session? And I’ll provide an example below.

A More Complex Application

Suppose I want to run a command in foreground, say ping, and keep track of its pid if it is running. Otherwise the failure message should be logged. Though this scenario is a bit trivial, it help us get to understand how to assemble the screen skills learnt above.

The service ping will success, and its pid is in ping.pid. The service continues running on foreground:

$ screen -S testing -pshell -X stuff 'ping 8.8.8.8 & echo $! > ping.pid; fg || echo "ping failed to start" | tee "ping.failure"\015'

The service ping will fail, and the error message will be written in ping.failure:

$ screen -S testing -pshell -X stuff 'ping 8.8.8. & echo $! > ping.pid; fg || echo "ping failed to start" | tee "ping.failure"\015'

References