4

我有一个问题,我一个接一个地运行我的 bash 命令行脚本,例如:

./process.sh data1.txt
./process.sh data2.txt
...
./process.sh dataN.txt

我想做的是将这些作为后台作业启动,但在任何给定时间只有 10 个运行。我可以用传统的编程语言来做到这一点(我很喜欢使用连接、等待风格的结构)我的问题是如何使用 UNIX bash 来做到这一点。

谢谢。

4

2 回答 2

4
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
于 2013-02-04T13:41:25.237 回答
2

您也可以使用xargs

$ for x in data*.txt; do echo "$x"; done | xargs -n 1 -P 10 ./process.sh

for循环的不同变体是可能的: find、简单echo data*.txt等。关键是在标准输入上生成文件名列表以供xargs读取。

于 2013-02-04T14:35:25.187 回答