我有一个问题,我一个接一个地运行我的 bash 命令行脚本,例如:
./process.sh data1.txt
./process.sh data2.txt
...
./process.sh dataN.txt
我想做的是将这些作为后台作业启动,但在任何给定时间只有 10 个运行。我可以用传统的编程语言来做到这一点(我很喜欢使用连接、等待风格的结构)我的问题是如何使用 UNIX bash 来做到这一点。
谢谢。
我有一个问题,我一个接一个地运行我的 bash 命令行脚本,例如:
./process.sh data1.txt
./process.sh data2.txt
...
./process.sh dataN.txt
我想做的是将这些作为后台作业启动,但在任何给定时间只有 10 个运行。我可以用传统的编程语言来做到这一点(我很喜欢使用连接、等待风格的结构)我的问题是如何使用 UNIX bash 来做到这一点。
谢谢。
BG_LIMIT=10
counter=0
for data in data*.txt; do
./process.sh $data &
if (( ++counter % $BG_LIMIT == 0 )); then
echo "Wating for background jobs to complete..."
wait
fi
done
echo "Waiting for any remaining jobs to complete..."
wait
您也可以使用xargs
:
$ for x in data*.txt; do echo "$x"; done | xargs -n 1 -P 10 ./process.sh
for
循环的不同变体是可能的: find
、简单echo data*.txt
等。关键是在标准输入上生成文件名列表以供xargs
读取。