如何在后台命令执行完成后在“while”循环中执行命令,同时仍在循环中

如何在后台命令执行完成后在“while”循环中执行命令,同时仍在循环中

如何在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”附近有语法错误

答案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

相关内容