我有观察程序脚本,它运行 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
首先创建一个示例
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