====== 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 #. [[https://www.gnu.org/software/screen/manual/screen.html#Colon|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 ==== [[http://www.softpanorama.org/Utilities/Screen/tips.shtml|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. #!/bin/bash # if [ $# -lt 2 ]; then echo "Usage: $0 [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 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 ===== Screen Resources ===== [[http://www.gnu.org/software/screen/|GNU Screen]] [[http://www.gnu.org/software/screen/manual/screen.html|Screen User Manual]]