I'm trying to build a command that launches screen, creates four sessions with different names, and run four different commands.
I know how to do this manually:
1. screen
2. ./command1 args
3. CTRL-A :sessionname Session 1
4. CTRL-A C
5. (GOTO 2)Can I do this with a bash script or something? How would I do so?
4 Answers
screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS" will spawn a screen running $COMMAND in the background.
You can see active sessions with screen -ls and reattach with screen -r "$SESSION_NAME".
Dead sessions can be killed with screen -wipe.
To start multiple sessions automatically, set up a .screenrc file, a config file for screen. In it, you can create sessions, start programs, change the working dir etc. I use it to initialise my screen session.
Simple exampe for a .screenrc file:
# don't display the copyright page
startup_message off
# increase scrollback buffer size
defscrollback 10000
# create windows
screen -t TODO vim TODO.txt
chdir src
screen -t coding vim main.c
screen -t run The screen commands above each create one screen session. -t sets the session's title; the rest of the line is the command to run and its parameters.
Thus, the first and second screen line start a session and launch vim inside. The third one just starts a session and drops you at a prompt. chdir changes the working directory for all subsequent sessions.
If you want to have multiple .screenrc files, just name them any way you want, and select one with screen -c myscreenrc.
You can use the d, m, S options together:
screen -Sdm s1
screen -Sdm s2
screen -Sdm s3S : To create a screen
d : detach from a screen
m : To enforce creation of screen, regardless whether screen is called from within another screen or not.
1I have many cases where I need to open up a set of hosts for investigation or support. Because I only need these additional windows occasionally I decided to use a shell script rather than .screenrc approach.
for example in ~/bin/prod_support:
#!/bin/bash
if [[ ! -z "$STY" ]]; then screen -t "hosta" ssh hosta screen -t "hostb" ssh hostb
else echo "start up screen first"
fiIf run from a non-screen shell I get a reminder... if run from inside screen, it will add titled windows for each script run.