【问题标题】:How to terminate a remote KDB+ session via script?如何通过脚本终止远程 KDB+ 会话?
【发布时间】:2013-02-04 16:19:24
【问题描述】:

我需要终止一个远程 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))

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

【问题讨论】:

    标签: kdb


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经尝试过异步调用,没有抛出错误,但它也没有关闭服务器。请记住,代码应该从脚本运行,而不是在交互模式下运行。
    • 这很奇怪;它对我来说似乎工作得很好(在 Windows 上)。将受保护的 eval 与同步调用一起使用会起作用,但也会产生在等待远程进程关闭时挂起客户端的副作用。如果您有很多进程要关闭,这可能会很糟糕。
    【解决方案2】:

    我设法通过使用Protected Evaluation 解决了这个问题:

    在 test.q 文件中:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2022-12-13
          • 2012-04-30
          • 2016-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-03
          相关资源
          最近更新 更多