Asynchronous shell commands
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...
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.
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 aSIGHUP
, it also sends aSIGHUP
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).
- One of the results is that the shell won't send it a
-
nohup
disconnects the process from the terminal, redirects its output tonohup.out
and shields it fromSIGHUP
.- 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).
- The process won't receive any sent
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