在后台运行psql命令的bash脚本的最佳实践是什么?

时间:2017-10-28 17:06:57

标签: bash sh psql

我一直在测试产品的连接性和稳定性,我的部分测试就是打开8个终端窗口,并启动一个使用psql查询远程数据库10次的脚本,每次查询获取50k行。我有命令别名,因为我计时,将结果记录到另一个文件等等。就在这里我会承认我不确定这是不是很好的做法,我对bash配置文件有点新鲜其余的。点击8个窗口(全部在一个更大的窗口内)变得非常烦人,所以我想我会尝试使用“&”在后台发射10次。这被证明是有问题的,并且比手动告诉8个窗口启动脚本要成功得多。主要是,我正在做的“&&&& etc等”的窗口永远不会“返回”,我必须按CTRL-C返回提示。另外,我从psql获得了更多的服务器错误。以下是我正在运行的两个命令,有些模糊和缩写:

test="(time bash ~/Documents/some/other/folders/myPsql.sh) >> \
~/Documents/some/stuff/logfile.txt 2>&1 && echo done"

shortcut="test & test & test & test & test & test & test & test & test & test"

这是psql脚本,当通过上面的“test”命令运行时工作正常:

psql << EOF
\pset pager off
\pset timing on
\copy (select * from sometable limit 50000) to '~/Documents/some/folder/file.csv' csv;
\q
EOF

我对这里工作的很多活动部分都很陌生,所以我认识到我所做的事情在某种程度上可能存在根本性的缺陷。

是否有任何“好”/更好的方法让我的“快捷方式”命令更加成功?

编辑:这是我所指的错误:

  

psql:服务器意外关闭了连接   这可能意味着服务器异常终止   处理请求之前或处理时。

我在Mac上使用iTerm2,而psql正在“与”本地软件客户端“交谈”,该客户端正在与Predix(CloudFoundry)上的其他软件进行交互,以查询Postgres数据库,也在Predix上。

1 个答案:

答案 0 :(得分:2)

A2:C9是标准化的shell命令。用你自己的名字覆盖它会打破相当多的脚本/函数/等。

test

一些注意事项:

  • 不要将命令存储在字符串中。见BashFAQ #50
  • psqlTest() { # DANGER: This filename can be used for SQL injection attacks. Keep it under control. local outFile=${1:-~/Documents/some/folder/file.csv} psql <<EOF \\pset pager off \\pset timing on \\copy (select * from sometable limit 50000) to '$outFile' csv; \\q EOF } parallelPsqlTest() { local count=${1:-10} # if not given a number, start 10 versions of our test for ((i=0; i<10; i++)); do psqlTest & done } 对shell有意义,但对大多数其他程序有意义。因此,在 shell启动路径传递给哪个软件之前,您希望将其展开(替换为~/home/whatever
  • 将变量替换为SQL文本是一个非常糟糕的主意。见Bobby Tables。即使对于文件名也是如此 - UNIX上的文件名可以包含引号,可以包含换行符,否则可能会包含一些您可能认为不能的内容。
  • 请勿使用名称/Users/whatever作为您自己的命令:它是http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html指定的test命令的正常名称
  • heredoc中的反斜杠需要加倍,以确保它们传递给[而不是由shell本身解释。