Reputation: 3073
I have a script which updates a web application. The web application is spread across 2 servers. Here is a rundown of the script
Each of the 7 steps are done one after the other synchronously. The total run time is approximately 9 seconds. To reduce downtime however, many of these steps could be done asynchronously.
For example, step 4 and 5 could be done at the same time. I want to start step 4 and 5 asynchronously (e.g. running in the background), but I cannot find how to wait until they are both completed before going further.
Upvotes: 5
Views: 6917
Reputation: 246807
You might want to use command grouping to maintain which steps need to be synchronous:
step1
( step2 && step4 && step6 ) &
( step3 && step5 && step7 ) &
wait && echo "all done"
Upvotes: 11
Reputation: 19233
You are looking for the wait
command.
wait: wait [id]
Wait for job completion and return exit status.
Waits for the process identified by ID, which may be a process ID or a
job specification, and reports its termination status. If ID is not
given, waits for all currently active child processes, and the return
status is zero. If ID is a a job specification, waits for all processes
in the job's pipeline.
Exit Status:
Returns the status of ID; fails if ID is invalid or an invalid option is
given.
Upvotes: 5
Reputation: 4384
launch step 4 and 5 in background in your script (ending &
), then simply call wait bash builtin before running step 6
Upvotes: 5