如何在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