Unix |动态运行并行进程[重复]

问题描述 投票:0回答:1

我有观察程序脚本,它运行 sqlplus 语句来获取准备好处理的文件。

一旦我得到了列表(FileList.txt),我就在 while 语句中使用这个文件来调用 java 命令来一一处理该文件。

一旦 while 语句完成,它将再次从 Sqlplus 获取另一组文件,并继续相同的过程,直到所有文件都完成。

问题:我需要并行运行该 java 命令,而不是在同一脚本中按顺序运行

FileList.txt
QWE
ASD
ZXV
POI
LKJ
MNB

正在脚本中获取的Java命令。这里$FILENAME是从FileList.txt中获取的

java -Dspring.config.location=/config/application.properties -Dlogging.config=/config/logback-spring.xml -Dlho.logdir=$LOG -jar $JARPATH  --fileName=$FILENAME

shell unix sh
1个回答
0
投票

首先创建一个示例

child.sh
,该示例可能需要可变的处理时间

#!/bin/bash
((delay=RANDOM%3 +1))
echo "Processing $1 over $delay seconds"
sleep $delay
echo "Processed $1"

接下来使用

xargs
函数和
-P 2
(两个并行执行):

cat FileList.CSV | xargs -n1 -P2 ./child.sh

示例输出,我手动添加了

(1)
(2)

(1) Processing QWE over 3 seconds
(2) Processing ASD over 1 seconds
(2) Processed ASD
(2) Processing ZXV over 1 seconds
(2) Processed ZXV
(2) Processing POI over 2 seconds
(1) Processed QWE
(1) Processing LKJ over 3 seconds
(2) Processed POI
(2) Processing MNB over 1 seconds
(2) Processed MNB
(1) Processed LKJ

如果您想在最后一个孩子完成后看到提示,请添加

wait
:

cat FileList.CSV | xargs -n1 -P2 ./child.sh& wait
© www.soinside.com 2019 - 2024. All rights reserved.