2013-02-04 48 views
2

我需要杀死远程KDB +会话。这可以通过几种方式完成,但我更愿意使用IPC处理程序。如何通过脚本终止远程KDB +会话?

我开始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)) 

任何想法?我真的很感激。

回答

3

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

如果你只是想发送的退出到远程服务器,而不会导致错误,您可以通过使用连接句柄负值(注意缺少的“亲密错误)异步发送请求:

q)h: hopen `::5000 
q)(neg h) (exit;0) 
q)\\ 
+0

我alread我尝试了一个异步调用,没有发生错误,但它也没有关闭服务器。请记住,代码应该从脚本运行,而不是以交互模式运行。 – nunaxe

+0

这很奇怪;它似乎对我来说很好(在Windows上)。在同步调用中使用受保护的eval将会起作用,但也会在等待远程进程关闭时挂起客户端的副作用。如果你有很多关闭的进程,这可能会很糟糕。 – mpud