2013-04-07 47 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