33

I want to run a bash script in a detached screen. The script calls a program a few times, each of which takes too long to wait. My first thought was to simply open a screen and then call the script, but it appears that I can't detach (by ctrl-a d) while the script is running. So I did some research and found this instruction to replace the shebang with following:

#!/usr/bin/screen -d -m -S screenName /bin/bash

But that doesn't work, either (the options are not recognized). Any suggestions?

PS It occurs to me just now that screen -dmS name ./script.sh would probably work for my purposes, but I'm still curious about how to incorporate this into the script. Thank you.

3 Answers 3

37

The shebang line you've seen may work on some unix variants, but not on Linux. Linux's shebang lines are limited: you can only have one option. The whole string -d -m -S screenName /bin/bash is passed as a single option to screen, instead of being passed as different words.

If you want to run a script inside screen and not mess around with multiple files or quoting, you can make the script a shell script which invokes screen if not already inside screen.

#!/bin/sh
if [ -z "$STY" ]; then exec screen -dm -S screenName /bin/bash "$0"; fi
do_stuff
more_stuff
2
  • It works well, what is the "$0" for here ?
    – Fabich
    Dec 19, 2016 at 17:37
  • 7
    @Lordofdark That's the script name. The script invokes screen which invokes /bin/bash which invokes the script again. Dec 19, 2016 at 18:33
23

According to the screen man pages:

  • screen -d -m Start screen in detached mode. This creates a new session but doesn't attach to it. This is useful for system startup scripts.
  • -S sessionname Set the name of the new session to sessionname.

So when I ran the command you provided: screen -dmS name ./script.sh

Screen starts a window called name and automatically runs that script.sh. To get back into there to see the status you would simply type: screen -r test

Now with Ubuntu 14.04, the commands are slightly different. Try:

screen -d -m -S test

Now for running the script, you will need to go to their config file to do so:

sudo vim /etc/screenrc

Once there, scroll down to the bottom and you will see:

# Example of automatically running some programs in windows on screen startup.
#
#   The following will open top in the first window, an ssh session to monkey
#   in the next window, and then open mutt and tail in windows 8 and 9
#   respectively.
#
# screen top
# screen -t monkey ssh monkey
# screen -t mail 8 mutt
# screen -t daemon 9 tail -f /var/log/daemon.log

This is the section where you will need to add the script name to run and that should allow you to do everything you needed from screen.

9
  • Somehow that command (screen -dmS ...) doesn't work for me, even though it really should. I run it and then screen -ls and no sockets are found. Thoughts?
    – bongbang
    Oct 14, 2014 at 22:45
  • What distro are you using?
    – ryekayo
    Oct 14, 2014 at 22:46
  • NAME="Ubuntu" VERSION="14.04.1 LTS, Trusty Tahr" I think. It's a virtual machine.
    – bongbang
    Oct 14, 2014 at 22:49
  • Gimme a bit because im just leaving work and ill try to use screen on my machine which is also ubuntu 14.04
    – ryekayo
    Oct 14, 2014 at 22:50
  • @bongbang - what version of screen do you have?
    – slm
    Oct 14, 2014 at 23:45
7

This is a bit old but one of the few threads I could find to do this. After toying arount the only way to get this running in detached mode with ubuntu 14. is

screen -d -m -t nameofwindow sh nameoflaunch.sh

The launch would be the second part above that houses the current java commands and server version. I run vanilla.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .