Screen Usage
Practical screen usage notes
Screen Commands
List of more important screen commands to effectively operate screen
When NOT in screen
Command | Description |
---|---|
screen -D | Power Detach - Close everything but keep the screens running in background. This is when you are done working! |
screen -R | When loggin back into the system do this to get back to the screens |
screen -d -r | Detach and Reattach. This is used when there are some screens stuck as attached but you are actually detached |
When in screen
Command | Description |
---|---|
Ctrl-a c | Create new screen terminal |
Ctrl-a d | Detach from screen termial and go to main non screen terminal |
Ctrl-a w | List all screen terminals |
Ctrl-a :at “#” stuff “echo hello world\n” | Send commands to other screen windows at #. Ref |
C-a h, C-a C-h | Save the scroll back buffer http://web.mit.edu/gnu/doc/html/screen_17.html |
C-a H | Begins/ends logging of the current window to the file `screenlog.n'. Saves Color codes https://stackoverflow.com/questions/18127728/differences-between-screenlog-and-hardcopy-on-gnu-screen |
From terminal you can see the Screen Name with echo $STY
. Relevant if you are having multiple screen sessions.
When in or not in screen
Command | Description |
---|---|
screen -D -RR | Power Detach, Reattach or create new screen if there is no screen running |
Sending commands to screen terminals
Reference - Scroll to scripting
Script to send commands to screen. steps
- Create two sessions
- One GNU screen session where all the scripting is directed to.
- Another sessions (can be screen if needed) where all the commands are sent from.
- Opening a named screen session called
thenag
as below
In Target Session, create a screen session named thenag
. If you want a different name you will also have to update the script to reflect this new name.
screen -S thenag
In the Command (From) Session, open a regular or optionally a screen session. Create and run this script as needed.
Run the script with the name of the host file that basically contains a list of servers, the command to send and the sleep time (default 0.2 seconds) between screens. The 1st time you want to run an init
command followed by a ssh
command. These are special commands that will create screen windows and start an SSH session to each host. When you are done you can send the quit
command to terminate the screen session.
- rs
#!/bin/bash # if [ $# -lt 2 ]; then echo "Usage: $0 <Host file> <Command> [sleep time]" echo "Host file contains the list of hosts to open screen session for" echo "Command is the command to execute on each screen session" echo "First time use init as Command to construct the screens" exit 1 fi # # Get a list (say server names) HOSTFILE=$1 # Create a counter for the screen windows HOSTCMD=$2 # Number of seconds to sleep if [ -z "$3" ]; then SLEEPTIME="0.2" else SLEEPTIME=$3 fi #if ! [[ "$SLEEPTIME" =~ ^[0-9]+$ ]]; then # SLEEPTIME=0 #fi #echo $SLEEPTIME #exit # Define a name for the screen session. SCRNAME='thenag' NOW=$(date +"%Y-%m-%d-%H-%M-%S") TMPFILE="/tmp/${SCRNAME}-${NOW}.txt" # if [ ! -f "$HOSTFILE" ]; then echo "File: $HOSTFILE does not exist" exit 1 fi # if [ "$HOSTCMD" == "init" ]; then echo "Initializing Screens ..." fi # if [ "$HOSTCMD" == "quit" ]; then echo "Quitting Screens ..." screen -S $SCRNAME -X quit exit fi declare sn integer sn=0 cat $HOSTFILE | while read ServerName do let sn++ echo "Processing $ServerName, Sequence $sn" case $HOSTCMD in init) # This creates a blank screen window for each instance screen -S $SCRNAME -X screen # Sleep may be required as sometimes commands get missed! sleep $SLEEPTIME screen -S $SCRNAME -p $sn -X stuff "echo $ServerName \n" ;; ssh) screen -S $SCRNAME -p $sn -X stuff "ssh ${ServerName}\n" sleep $SLEEPTIME ;; tail) screen -S $SCRNAME -p $sn -X hardcopy $TMPFILE sleep $SLEEPTIME sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' $TMPFILE tail -3 $TMPFILE rm $TMPFILE echo "--------------------------------" ;; *) screen -S $SCRNAME -p $sn -X stuff "${HOSTCMD} \n" sleep $SLEEPTIME esac done
Command Examples
Below are the steps and command examples to execute commands across screens
- Setup host file - in this case we are calling it webs.txt
- webs.txt
server80 server81 server82 server83
- Initialize the screen
./rs webs.txt init
Output:
Initializing Screens ... Processing server80, Sequence 1 Processing server81, Sequence 2 Processing server82, Sequence 3 Processing server83, Sequence 4
- SSH into each host
./rs webs.txt ssh
Output: The same as above in init
- Run a custom command (in this case
sudo su - serviceacc
)
../rs webs.txt "sudo su - serviceacc"
Output: The same as above in init
- Just hit enter
./rs webs.txt ""
- Tail the last 3 lines of the output on each session
./rs webs.txt tail
Output: Will display Host Sequence and tail lines from the session
- Quit all screen sessions (opposite of init)
./rs webs.txt quit
Output: Quitting Screens …
Original Script for reference
The hard-coded version of the script. Notice how you can pass passwords if required as well.
#!/bin/bash # # Get a list (say server names) HOSTFILE=$1 # Create a counter for the screen windows declare sn integer sn=0 cat $HOSTFILE | while read ServerName do let sn++ echo "$ServerName - $sn" # This creates a blank screen window for each instance screen -S thenag -X screen # Sleep may be required as sometimes commands get missed! sleep 1 screen -S thenag -p $sn -X stuff "echo $ServerName \n" screen -S thenag -p $sn -X stuff "ssh ${ServerName}\n" sleep 1 screen -S thenag -p $sn -X stuff "ls -ld /tmp/files \n" screen -S thenag -p $sn -X stuff "sudo /bin/bash \n" sleep 1 # You can even send password!!! screen -S thenag -p $sn -X stuff "sudopasswordgoeshere\n" sleep 1 screen -S thenag -p $sn -X stuff "cd /tmp/files \n" screen -S thenag -p $sn -X stuff "./run_install \n" done # Let the install proceed on all screens sleep 30 # Check on the installs sn=0 cat $HOSTFILE | while read ServerName do let sn++ echo "$ServerName - $sn" screen -S thenag -p $sn -X stuff "echo $? \n" # Display last three lines of screen terminal screen -S thenag -p $sn -X hardcopy /tmp/s1.txt tail -3 /tmp/s1.txt rm /tmp/s1.txt echo "--------------------------------" done