2013-04-07 45 views
3

我想要一个outfile查询为数组中的每个值运行一个进程,以加快从mysql导出数据的过程,就像在多个核心上运行脚本一样。我的bash脚本是:bash脚本在28个内核上运行查询

dbquery=$(mysql -u user -p -e "SELECT distinct(ticker) FROM db.table") 
array=($(for i in $dbquery ; do echo $i ; done)) 
csv() 
{ 
dbquery=$(mysql -u user --password=password -e "SELECT * FROM db2.table2 WHERE symbol = '$i' INTO OUTFILE '/tmp/$i.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'") 
} 

set -m 

for i in 'seq 28'; do #trying to run on 28 cores 
    for j in ${array[@]}; do 
    csv $j & 
    done 
    sleep 5 & 
done 

while [ 1 ]; 
do 
    fg 2> /dev/null; [ $? == 1 ] && break; 
done 

现在我跑了这一点,因为我希望它也它不导出文件,我无法弄清楚如何杀死进程。你能帮我理解如何解决这个问题,以便它能运行每个代码的outfile查询吗?另外,如何杀死正在运行的当前脚本而不会终止正在运行的其他脚本和程序?

+3

做一个'人xargs'。它可能使事情变得更容易。祝你好运。 – shellter 2013-04-07 13:51:45

回答

2

您可以使用xargs的自动处理作业调度:

dbquery=$(mysql -u user -p -e "SELECT distinct(ticker) FROM db.table") 
array=($(for i in $dbquery ; do echo $i ; done)) 
csv() 
{ 
dbquery=$(mysql -u user --password=password -e "SELECT * FROM db2.table2 WHERE symbol = '$i' INTO OUTFILE '/tmp/$i.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'") 
} 

export -f csv 
echo "${array[@]}" | xargs -P 28 -n 1 bash -c 'csv "$1"' -- 

与方法的问题是,由于循环嵌套时,你开始的所有进程每28倍,而不是运行它们一次一次28个。

1

wait将等到所有的子进程完成。

for i in 'seq 28'; do #trying to run on 28 cores 
    for j in ${array[@]}; do 
    csv $j & 
    done 
done  
wait 
+0

我重置它在15个内核上运行,但它似乎在所有内核上运行。你知道这种情况发生的原因吗?并感谢你的回应。 – 2013-04-07 15:14:11