Anon21
Anon21

Reputation: 3073

Linux shell script asynchronous commands and notification when completed

I have a script which updates a web application. The web application is spread across 2 servers. Here is a rundown of the script

  1. The shell script updates the git repository.
  2. The shell script stops the application server.
  3. The shell script stops the web server.
  4. The shell script instructs the application server to checkout the latest git update.
  5. The shell script instructs the web server to checkout the latest git update.
  6. The shell script starts the application server.
  7. The shell script starts the web server.

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

Answers (3)

glenn jackman
glenn jackman

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

Michał Górny
Michał Górny

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

Stephane Rouberol
Stephane Rouberol

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

Related Questions