Let’s check this small script
– foo.sh
#!/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 &
– bar.sh
#!/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
running 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
– baz.sh
#!/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