测试 kdb 是否正在接受来自 bash 的连接

Testing if kdb is accepting connections from bash

这是我的 kbd 脚本。 它确实依赖于大量的环境文件。我的脚本无法连接到 KDB 数据库,因为它太忙而无法接受连接。 我想在 运行 编写脚本之前测试与 kdb 的连接。我只想知道 kdb 是否正在接受连接并使其等于 bash 退出值。 0 或 1
这是我的 KDB 脚本:

system "l ",(getenv`CASPER),"/CASPER/q/CASPER_lib.q";
system "l ",(getenv`CASPER),"/CASPER/q/report_lib.q";
system "l ",(getenv`CASPER),"/reporting/q/reporting_utils.q";
\c 50 2000
\P 0

\p 0W
port:system"p"
3 (string port),"\n"
hclose 3

params:.Q.def [(`tradedate`CASPERhost)!(.z.d;`)] .Q.opt .z.x;
tradedate:params`tradedate;
CASPERhost:string params`CASPERhost;

h:.U.connect[`kdb;CASPERhost;"";()];
h1:.U.connect[`kdb;getenv`QUERY_GATEWAY;"";()];    


hclose h;
hclose h1;

我只想测试与 kdb 的连接 - 从 bash 脚本。打开关闭,就是看能不能连上数据库 但是,当我 运行 bash 时,它会转到 q 提示符。我必须用 \(两个斜杠)手动关闭。我如何测试 kdb 数据库是否正在接受来自 bash 脚本的连接。

这是我的bash脚本

#!/bin/bash
q kdb_filehandle.q

您可以使用 with q 的 exit 命令以退出代码终止;

q)exit 1
$ echo $?
1

q) exit 0
$ echo $?
0

考虑到这一点,您可以错误地捕获您的连接并让它们在失败时以 1 退出/例如,如果您想捕获您的希望,您可以使用

.[.U.connect;(`kdb;CASPERhost;"";());exit 1]

这里。是陷阱运算符,.U.connect是你的函数,你的参数作为一个列表()传入,第三个参数是出错时执行的语句,在本例中是exit 1.

http://code.kx.com/q/ref/errors/#trap

您还可以将 q 个脚本作为 shebang 执行,以避免必须将您的脚本包装在 bash 中。刚开始你的脚本;

#!/usr/bin/env q

http://code.kx.com/q/cookbook/faq/#can-i-execute-q-as-a-shebang-script