How can I run a shell script in background?


Depending on what you are wanting, just add a & to the end of the command

script.sh &
command &

If you are running it in a terminal, and you want to then close the terminal, use nohup or disown


nohup script.sh &


script &

If that is not what you are after, please be more specific in your question.

  • You are most welcome – Panther Dec 15 '11 at 21:59
  • What if I for example need to run 2 scipts and then I want to run htop to see CPU usage, but problem is that 1st script start to create output to console and it seems prevent other actions(run second script, run htop). – mrgloom May 31 '16 at 19:33
  • if the script has print statements, will those be displayed on my terminal? – Charlie Parker Sep 14 '16 at 0:19
  • I had to use nohup to prevent a script (executed with &) that I had to bg from halting for some reason. – Geremia Mar 2 at 21:15

you can just switch screen and run your script on that 2nd screen. When script started on 2nd, switch back to 1st and do whatever you want. 2nd screen will be in the background as extra "terminal window". and it will not stop processing even when you close your ssh connection while beeing at 1st screen.

screen --help
Use: screen [-opts] [cmd [args]]
 or: screen -r [host.tty]

-4            Resolve hostnames only to IPv4 addresses.
-6            Resolve hostnames only to IPv6 addresses.
-a            Force all capabilities into each window's termcap.
-A -[r|R]     Adapt all windows to the new display width & height.
-c file       Read configuration file instead of '.screenrc'.
-d (-r)       Detach the elsewhere running screen (and reattach here).
-dmS name     Start as daemon: Screen session in detached mode.
-D (-r)       Detach and logout remote (and reattach here).
-D -RR        Do whatever is needed to get a screen session.
-e xy         Change command characters.
-f            Flow control on, -fn = off, -fa = auto.
-h lines      Set the size of the scrollback history buffer.
-i            Interrupt output sooner when flow control is on.
-l            Login mode on (update /var/run/utmp), -ln = off.
-ls [match]   or -list. Do nothing, just list our SockDir [on possible matches].
-L            Turn on output logging.
-m            ignore $STY variable, do create a new screen session.
-O            Choose optimal output rather than exact vt100 emulation.
-p window     Preselect the named window if it exists.
-q            Quiet startup. Exits with non-zero return code if unsuccessful.
-r [session]  Reattach to a detached screen process.
-R            Reattach if possible, otherwise start a new session.
-s shell      Shell to execute rather than $SHELL.
-S sockname   Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
-t title      Set title. (window's name).
-T term       Use term as $TERM for windows, rather than "screen".
-U            Tell screen to use UTF-8 encoding.
-v            Print "Screen version 4.01.00devel (GNU) 2-May-06".
-wipe [match] Do nothing, just clean up SockDir [on possible matches].
-x            Attach to a not detached screen. (Multi display mode).
-X            Execute <cmd> as a screen command in the specified session.

ctrl+a, c will create a new "window" in your active screen session. You can switch between multiple windows (as Ansgar indicated) with ctrl+a, n for the next window, and ctrl+a,p for the previous window.

ctrl+a," will give you a list of all your open windows.

More: https://superuser.com/questions/476709/quickly-switching-between-virtual-sessions-screen


If you want the script to remain after closing the terminal, another option is to use setsid:

setsid script.sh

For more information about the differences between nohup, disown, & and setsid: Difference between nohup, disown and &

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.