gpt4 book ai didi

用于在 28 个内核上运行查询的 Bash 脚本

转载 作者:行者123 更新时间:2023-11-29 09:28:34 26 4
gpt4 key购买 nike

我正在尝试让输出文件查询为数组中的每个值运行一个进程,以加快从 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 查询吗?另外,如何在不杀死正在运行的其他脚本和程序的情况下杀死当前正在运行的脚本?

最佳答案

您可以使用 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 次。

关于用于在 28 个内核上运行查询的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com