bash - 如何在一个脚本中同时创建多个连接

bash - 如何在一个脚本中同时创建多个连接

我正在尝试编写一个简单的 bash 脚本,以同时在数据库中触发一系列查询,以进行负载测试。

到目前为止,我有一个名为“input_file”的文件,其中包含以下内容:

select sleep(10);
select sleep(11);
select sleep(12);
select sleep(13);
select sleep(14);
select sleep(15);
select sleep(16);
select sleep(17);
select sleep(18);
select sleep(19);
select sleep(20);

然后我有以下代码:

IFS=$'\n'
for line in $(cat input_file)
do
{
    mysql -S[socket] -u[username] -p[password] -e${line}
}
done

但它不是同时运行查询,而是一次运行一个查询,并等待每个查询完成后再开始下一个查询。我希望它启动第一个查询,然后继续而不等待它完成,这样我最终会同时运行所有查询。

我看过很多关于有相反问题的人的帖子,但我似乎无法让他们的任何“错误”例子发挥作用。

答案1

在评论部分已经提到,您可以添加&到 mysql 命令的末尾以使其在后台运行。我想建议另一种使用 GNU 的方法xargs

cat input_file | xargs --no-run-if-empty --delimiter '\n' --max-procs 0 -I '{}' mysql -S[socket] -u[username] -p[password] -e'{}'

# Or with short flags...
xargs -r -d '\n' -P 0 -I '{}' mysql -S[socket] -u[username] -p[password] -e'{}' < input_file

# Or letting xargs open the file and leave its stdin alone...
xargs --arg-file input_file -r -d '\n' -P 0 -I '{}' mysql -S[socket] -u[username] -p[password] -e'{}'
  • -r/--no-run-if-empty以避免在输入为空时运行 mysql。
  • --delimiter '\n'/ -d '\n'- 输入项以新行结束。处理输入时,引号和反斜杠并不特殊;输入中的每个字符均按字面意思处理。如果没有此选项,它将无法在包含反斜杠或引号的输入中正常工作(在 SQL 代码中常见)。”
  • -P max-procs/ --max-procs=max-procs- 一次最多运行 max-procs 个进程;默认值为 1。如果 max-procs 为 0,xargs 将一次运行尽可能多的进程。
  • -I replace-str- 将初始参数中出现的replace-str 替换为从输入中读取的名称。
  • -a file/ --arg-file file- 从指定文件而不是标准输入中读取参数。

使用GNU的好处xargs是你可以通过将<max-procs>参数设置为-P0以外的任何数字来限制并发进程的数量。在这种情况下,如果你的输入很长并且太多的并发进程可能会影响服务器,你可以限制并发。

相关内容