3

I have 3 nice commands that are dumping some databases, and compress assets for a backup. After that, the files should be copied to another server. I'm using this command:

nice mysqldump -u user1 -p'XXX' database1 | gzip > database1.sql.gz
nice mysqldump -u user2 -p'XXX' database2 | gzip > database2.sql.gz
nice zip -r assets.zip /var/www/site1/assets/

cd ..

scp -R backups user@backupserver.com:/home/user/backups

My problem is, that the scp commands seems to get executed, BEFORE the nice commands are finished. This leads to partial SQL dumps, and sometimes broken zip files.

So how can I be sure, that all 3 nice commands are finished, before copying the files to another server?

2
  • 2
    Is this all inside of a bash script (somescript.bash), and none of these are backgrounded, correct? If so I don't see how the next command could start until the prior one was done.
    – slm
    Jul 23, 2013 at 2:42
  • There is probably another reason your mysqldump is incomplete (eg a corrupt table).
    – jordanm
    Jul 23, 2013 at 2:51

1 Answer 1

1

You want to use the wait shell built in.

Execute commands in the background, then tell the shell to wait for all of them to finish before continuing. Here's a very basic example:

#!/bin/bash

sleep 6 && echo first sleep  &
WAITPID="$!"
sleep 3 && echo second sleep &
WAITPID="$WAITPID $!"

echo "waiting"
wait $WAITPID
echo "done waiting"

Notes:

  • The pid of background processes is collected into WAITPID and the list is fed to wait. You can also use job numbers instead.
  • When you run this you'll see that second sleep finishes first.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.