Start a screen session and run a script without attaching to it?

I'm trying to write a script to:

  1. Start a new screen session
  2. Run some program or script within that new screen session
  3. Detach from the screen session, while the program from step 2 may still be running in there. If the program from step 2 finishes, immediately or later, the screen session should remain running (detached).

I have been trying all sorts of combinations with screen -X program or screen -S somename followed by program followed by screen -D, combining with -d or -m options which I find in related questions and answers but nothing works.

The closest I could get was this:

screen -S MySessionName -d -m myprogram

This launches a new screen session in the backgroun, running myprogram. Except as soon as myprogram finishes (sometimes instantly) the screen session terminates, whereas I want to keep it running.


Solution 1:

Method 1

I created a demo setup you described here in my machine. I also faced the issue you reported. But adding a small line of script solved my issue.

I added the following line at the end of myprogram

exec $SHELL

After your script is finished, the Bash process will replace itself with a new invocation of itself.

Method 2

Or you can try the following method in which we start a detached screen first and send command to that screen using stuff

For this first you need to start a detached screen.

screen -dmS MySessionName

And then send the script to that screen.

screen -S MySessionName -p 0 -X stuff 'myprogram\n'

This also worked for me.