我有一个包含300行的员工档案。现在我正在读取其中的所有行并调用子进程来处理。但是我需要一次读取20行并为其调用SubProcess并迭代直到它完成所有300行?
while read -r name age empno ; do
echo $EmpName $EmpAge $EmpNumber
./run.sh RUN_EMP -a $EmpName -b $EmpAge -c $EmpNumber &
done < "$File_Employee" > /logs/Emp_`date +%Y%m%d%H%M`.log
wait
Shell Scripting中有一个选项来限制要读取的行数吗?
如果我需要在任何给定时间运行20个进程;我的下面的方法是否正常?当我尝试执行此过程时,该过程将运行前20个作业并优雅地存在。
while read -r empname empage empnumber ; do
echo $empname $empage $empnumber
while [[ $( jobs | wc -l ) -ge 20 ]]
do
echo going to sleep now at $(date)
sleep 3
done
./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
done <"$File_Employee" >Emp_`date +%Y%m%d%H%M`.log
wait
答案 0 :(得分:1)
此bash
脚本计算创建的./run.sh
个进程的数量,每20个进程计数,它会停止并在开始更多之前等待它们完成:
#!/bin/bash
count=0
while read -r empname empage empnumber ; do
echo $empname $empage $empnumber
./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
((++count % 20 == 0 )) && wait
done <"$File_Employee" >/logs/Emp_`date +%Y%m%d%H%M`.log
这里的关键变化是这一行:
((++count % 20 == 0 )) && wait
此行将计数递增1,然后检查count
是否为20的倍数。如果是,则调用等待后台进程的bash
内置wait
完成。
以下内容适用于任何POSIX shell:
File_Employee=employees
count=0
while read -r empname empage empnumber ; do
echo $empname $empage $empnumber
./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
count=$((count+1))
[ 0 -eq $((count % 20)) ] && wait
done <"$File_Employee" >Emp_`date +%Y%m%d%H%M`.log
答案 1 :(得分:0)
你可以这样做
end=0
while [ $end -eq 0 ]; do
for (( i=0 ; $i < 20 ; i++ )) do
read -r name age empno || {
end=1
break
}
# do something with it
done
# do something with the group
done
还有其他类似的形式。请注意,您可能需要为输入不均匀分成20行组的可能性做好准备。示例代码尽可能地处理,但“做某事”部分可能需要自己的调整。