我正在尝试让outfile查询在数组中为每个值运行一个进程,以加快从mysql导出数据的过程,id就像在多个核心上运行脚本一样。我的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查询吗?另外,如何在不杀死正在运行的其他脚本和程序的情况下终止正在运行的当前脚本?
答案 0 :(得分: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 :(得分:1)
wait
将等待所有子进程完成。
for i in 'seq 28'; do #trying to run on 28 cores
for j in ${array[@]}; do
csv $j &
done
done
wait