我正在尝试编写一个简单的 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>
参数设置为-P
0以外的任何数字来限制并发进程的数量。在这种情况下,如果你的输入很长并且太多的并发进程可能会影响服务器,你可以限制并发。