Question: I want to build a bash script that executes a command and in the meanwhile performs other stuff, with the possibility of killing the command if the script is killed. Say, executes a cp of a large file and in the meanwhile prints the elapsed time since copy started, but if the script is killed it kills also the copy. 
I *don't* want to use rsync, for 2 reasons: 1) is slow and 2) I want to learn how to do it, it could be useful.
I tried this:

```
until cp SOURCE DEST
do
#evaluates time, stuff, commands, file dimensions, not important now
#and echoes something
done

```

but it doesn't execute the `do - done` block, as it is waiting that the copy ends. Could you please suggest something?

Answer: 
`until` is the opposite of `while`. It's nothing to do with doing stuff while another command runs. For that you need to run your task in the background with `&`.

```
cp SOURCE DEST &
pid=$!

# If this script is killed, kill the `cp'.
trap "kill $pid 2> /dev/null" EXIT

# While copy is running...
while kill -0 $pid 2> /dev/null; do
    # Do stuff
    ...
    sleep 1
done

# Disable the trap on a normal exit.
trap - EXIT

```

`kill -0` checks if a process is running. Note that it doesn't actually signal the process and kill it, as the name might suggest. Not with signal 0, at least.
What you want is to do two things at once in shell. The usual way to do that is with a **job**. You can start a background job by ending the command with an ampersand.

```
copy $SOURCE $DEST & 

```

You can then use the `jobs` command to check its status.

Read more:

* [Gnu Bash Job Control](http://www.gnu.org/software/bash/manual/html_node/Job-Control.html#Job-Control)