Как выполнить команду в цикле «while» после того, как фоновая команда завершила выполнение, при этом все еще проходя цикл

Как выполнить команду в цикле , в то время как после завершения выполнения фоновой команды внутри цикла, при этом все еще проходя цикл? Я включил комментарии в код, чтобы объяснить, что я имею в виду более четко.

while read file; 
      # run command 1 in the background. command 1 takes in "file" as an argument and does some processing on it
      # run command 2 after command 1 is done, but keep going through the loop. Command 2 deletes "file"
done

РЕДАКТИРОВАТЬ: Одно из решений, которое я могу придумать, - это поместить тело цикла while в скрипт и запустить его в фоновом режиме, но я не уверен, что это лучший способ сделать это, и если есть лучший способ

РЕДАКТИРОВАТЬ 2: Я попробовал предложение @ steeldriver (см. комментарии), но я получаю синтаксическую ошибку Вот мой код:

#!/bin/bash

set -e 

MONITORDIR="/home/user/random/ready_for_mapping/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE; do
    file_dir=$(echo $NEWFILE | rev | cut -d / -f2- | rev)
    if [[ $NEWFILE == *"paired"* ]]; then
        while (( $(ls -1 $file_dir | wc -l) != 2 )); do
            sleep 1
        done

        { kallisto quant -i /home/user/random/Caenorhabditis_elegans.WBcel235.cdna.all.index -o $file_dir -t 12 $(ls $file_dir -1 | head -1) $(ls $file_dir -1 | tail -1) ;
        rm $file_dir/*gz }&
    else
        { kallisto quant -i /home/user/random/Caenorhabditis_elegans.WBcel235.cdna.all.index -o $file_dir --single -t 12 -l 250 -s 30 $(ls $file_dir *gz) ;
        rm $file_dir/*gz }&
    fi
done

Вот ошибка, которую я получаю:

./ second_queue: строка 15: синтаксическая ошибка рядом с неожиданным токеном `else '

0
задан 15 July 2020 в 04:07

1 ответ

Запомните PID длительного процесса и используйте его для проверки в цикле. bash возвращает PID фонового процесса в $! сразу после помещения задания в фоновый режим.

Сделайте что-то вроде (не проверено):

command_1 &
cpid=$!
  
....
  
# inside the loop,
if [[ -d /proc/$cpid ]] ; then
   : command_1 still running
else
   : command_1 not running
fi
0
ответ дан 30 July 2020 в 22:07

Другие вопросы по тегам:

Похожие вопросы: