3

我试图让一个 outfile 查询在数组中的每个值运行一个进程,以加快从 mysql 导出数据的过程,我喜欢在多个内核上运行脚本。我的 bash 脚本是:

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 查询吗?另外,如何在不杀死正在运行的其他脚本和程序的情况下终止当前正在运行的脚本?

4

2 回答 2

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 次。

于 2013-04-07T17:47:45.233 回答
1

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

for i in 'seq 28'; do    #trying to run on 28 cores
  for j in ${array[@]}; do
    csv $j &
  done
done    
wait
于 2013-04-07T12:02:40.570 回答