Let’s check this small script
#!/bin/sh echo foo.1:`date` | tee $HOME/tmp/foo.txt sleep 3 echo foo.2:`date` | tee -a $HOME/tmp/foo.txt
$ $HOME/tmp/foo.sh foo.1:Thu Nov 27 17:34:53 CET 2014 foo.2:Thu Nov 27 17:34:56 CET 2014
Very obvious, I write to the console, wait three seconds, then write to the console.
Ok, let’s take another script that would call this script in the background using &
#!/bin/sh echo bar.1:`date` $HOME/tmp/foo.sh & echo bar.2:`date`
$ $HOME/tmp/bar.sh bar.1:Thu Nov 27 17:36:32 CET 2014 bar.2:Thu Nov 27 17:36:32 CET 2014 $ foo.1:Thu Nov 27 17:36:32 CET 2014 foo.2:Thu Nov 27 17:36:35 CET 2014
bar is printing the date, calling
foo in the background, then printing the date, then it returns to you, and
foo is still running.
BUT this is only in a relative background …
Let’s try this
$ time $HOME/tmp/bar.sh > /dev/null real 0m0.01s user 0m0.00s sys 0m0.00s
So it takes no time to run
bar you believe ?
Let’s try, for instance, over ssh (or cron or whatever)
$ time ssh localhost $HOME/tmp/bar.sh > /dev/null real 0m3.81s user 0m0.01s sys 0m0.01s
bar suddenly waits 3 seconds for
foo to finish.
To be sure the script is sent to the farest background, you need to close the file descriptors, stdin, stdout, stderr
I rewrote it as
#!/bin/sh echo bar.1:`date` $HOME/tmp/foo.sh <&- >&- 2>&- & echo bar.2:`date`
$ time ssh localhost $HOME/tmp/baz.sh >/dev/null real 0m0.44s user 0m0.00s sys 0m0.00s
Now the script
baz is immediately finished and does not wait for
foo to complete