如何终止远程KDB+;通过脚本进行会话?

如何终止远程KDB+;通过脚本进行会话?,kdb,Kdb,我需要终止一个远程KDB+会话。这可以通过几种方式完成,但我更喜欢使用IPC处理程序 我启动KDB+会话: $ q -p 5000 KDB+ 3.0 2012.11.13 Copyright (C) 1993-2012 Kx Systems 然后,我启动另一个KDB会话,并成功终止服务器: $ q KDB+ 3.0 2012.11.13 Copyright (C) 1993-2012 Kx Systems q)h: hopen `::5000 q)h(exit;0) 'close q)\\

我需要终止一个远程KDB+会话。这可以通过几种方式完成,但我更喜欢使用IPC处理程序

我启动KDB+会话:

$ q -p 5000
KDB+ 3.0 2012.11.13 Copyright (C) 1993-2012 Kx Systems
然后,我启动另一个KDB会话,并成功终止服务器:

$ q
KDB+ 3.0 2012.11.13 Copyright (C) 1993-2012 Kx Systems

q)h: hopen `::5000
q)h(exit;0)
'close
q)\\
但是,如果我使用上述指令创建脚本(test.q),它将失败:

$ cat test.q 
h: hopen `::5000
h(exit;0)
\\

$ q test.q 
KDB+ 3.0 2012.11.13 Copyright (C) 1993-2012 Kx Systems

k){0N!x y}
'close
@
"q"
"h(exit;0)"
q))

有什么想法吗?我真的很感激

您正在向远程服务器发出同步请求,这意味着您需要响应。问题是您的请求会导致远程服务器关闭并立即关闭连接,从而导致错误并导致q进入调试模式

如果您只想向远程服务器发送出口而不引起错误,则可以使用连接句柄的负值异步发送请求(请注意缺少“关闭错误”):


我通过以下方法解决了这个问题:

test.q文件中:

h: hopen `::5000
@[h; "exit 0"; {}]
\\

您可能想尝试异步。如果需要,也可以尝试延迟异步
(neg h)({exit 0};`)[]

您可以选择显式关闭会话并放弃句柄:

h: hopen `:hostname:port  <BR>
h <BR>
h:hclose <BR>
h<BR>
h:hopen`:hostname:port
h
h:hclose
h

我已经尝试了一个异步调用,没有抛出错误,但它也没有关闭服务器。请记住,代码应该从脚本运行,而不是以交互模式运行;(在Windows上)它似乎对我很好。将protected eval与同步调用一起使用会起作用,但也会产生副作用,即在等待远程进程关闭时挂起客户端。如果要关闭很多进程,这可能会很糟糕。
h: hopen `:hostname:port  <BR>
h <BR>
h:hclose <BR>
h<BR>