Home > Net >  How to wait in bash till a shell script is finished?
How to wait in bash till a shell script is finished?

Time:04-26

right now I'm using this script for a program:

export FREESURFER_HOME=$HOME/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

cd /home/ubuntu/fastsurfer
datadir=/home/ubuntu/moya/data
fastsurferdir=/home/ubuntu/moya/output
mkdir -p $fastsurferdir/logs # create log dir for storing nohup output log (optional)

while read p ; do
  echo $p
  nohup ./run_fastsurfer.sh --t1 $datadir/$p/orig.nii \
                            --parallel --threads 16 --sid $p --sd $fastsurferdir > $fastsurferdir/logs/out-${p}.log &
  sleep 3600s
done < /home/ubuntu/moya/data/subjects-list.txt

Instead of using sleep 3600s, as the program needs around an hour, I'd like to use wait until all processes (several PIDS) are finished. If this is the right way, can you tell me how to do that?

BR Alex

CodePudding user response:

wait will wait for all background processes to finish (see help wait). So all you need is to run wait after creating all of the background processes.

CodePudding user response:

This may be more than what you are asking for but I figured I would provide some methods for controlling the number of threads you want to have running at once. I find that I always want to limit the number for various reasons.

Explaination

The following will limit concurrent threads to max_threads running at one time. I am also using the main design pattern so we have a main that runs the script with a function run_jobs that handles the calling and waiting. I read all of $p into an array, then traverse that array as we launch threads. It will either launch a thread up to 4 or wait 5 seconds, once there are at least one less than four it will start another thread. When finished it waits for any remaining to be done. If you want something more simplistic I can do that as well.

#!/usr/bin/env bash

export FREESURFER_HOME=$HOME/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

typeset max_threads=4
typeset subjects_list="/home/ubuntu/moya/data/subjects-list.txt"
typeset subjectsArray

run_jobs() {
    local child="$$"
    local num_children=0
    local i=0
    while [[ 1 ]] ; do
        num_children=$(ps --no-headers -o pid --ppid=$child | wc -w) ; ((num_children-=1))
        echo "Children: $num_children"
        if [[ ${num_children} -lt ${max_threads} ]] ;then
            if [ $i -lt ${#subjects_list[@]}] ;then
                ((i =1))
                # RUN COMMAND HERE &
                ./run_fastsurfer.sh --t1 $datadir/${subjects_list[$i]}/orig.nii \
                                --parallel --threads 16 --sid ${subjects_list[$i]} --sd $fastsurferdir 
            fi
        fi
        sleep 10
    done
    wait
}


main() {
    cd /home/ubuntu/fastsurfer
    datadir=/home/ubuntu/moya/data
    fastsurferdir=/home/ubuntu/moya/output
    mkdir -p $fastsurferdir/logs # create log dir for storing nohup output log (optional)

    mapfile -t subjectsArray < ${subjects_list}
    run_jobs
}

main

Note: I did not run this code since you have not provided enough information to actually do so.

  • Related