Asynchronous shell commands

LinuxBashShellUbuntuAsynchronous

Linux Problem Overview


I'm trying to use a shell script to start a command. I don't care if/when/how/why it finishes. I want the process to start and run, but I want to be able to get back to my shell immediately...

Linux Solutions


Solution 1 - Linux

You can just run the script in the background:

$ myscript &

Note that this is different from putting the & inside your script, which probably won't do what you want.

Solution 2 - Linux

Everyone just forgot disown. So here is a summary:

  • & puts the job in the background.

    • Makes it block on attempting to read input, and
    • Makes the shell not wait for its completion.
  • disown removes the process from the shell's job control, but it still leaves it connected to the terminal.

    • One of the results is that the shell won't send it a SIGHUP(If the shell receives a SIGHUP, it also sends a SIGHUP to the process, which normally causes the process to terminate).
    • And obviously, it can only be applied to background jobs(because you cannot enter it when a foreground job is running).
  • nohup disconnects the process from the terminal, redirects its output to nohup.out and shields it from SIGHUP.

    • The process won't receive any sent SIGHUP.
    • Its completely independent from job control and could in principle be used also for foreground jobs(although that's not very useful).
    • Usually used with &(as a background job).

Solution 3 - Linux

nohup cmd

doesn't hangup when you close the terminal. output by default goes to nohup.out

You can combine this with backgrounding,

nohup cmd &

and get rid of the output,

nohup cmd > /dev/null 2>&1 &

you can also disown a command. type cmd, Ctrl-Z, bg, disown

Solution 4 - Linux

Alternatively, after you got the program running, you can hit Ctrl-Z which stops your program and then type

> bg

which puts your last stopped program in the background. (Useful if your started something without '&' and still want it in the backgroung without restarting it)

Solution 5 - Linux

screen -m -d $command$ starts the command in a detached session. You can use screen -r to attach to the started session. It is a wonderful tool, extremely useful also for remote sessions. Read more at man screen.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLorenVSView Question on Stackoverflow
Solution 1 - LinuxCarl NorumView Answer on Stackoverflow
Solution 2 - LinuxAni MenonView Answer on Stackoverflow
Solution 3 - LinuxSteve B.View Answer on Stackoverflow
Solution 4 - LinuxpajtonView Answer on Stackoverflow
Solution 5 - LinuxmluthraView Answer on Stackoverflow