You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java结合Telnet正常退出QEMU进程

Java连接QEMU Telnet监视器发送quit无响应的问题排查

问题1:命令内容格式错误

你代码里的out.println("quit\\r\\n ")存在两处错误:

  • println方法会自动在字符串末尾添加系统默认换行符(通常是\n),而你手动添加了\\r\\n,实际发送的内容是quit\r\n \n——多了一个空格和额外换行,QEMU无法识别这个格式错误的命令。
  • QEMU的Telnet监视器只需要接收quit加上正确的换行标识(一般是\r\n)即可,不需要额外字符。

问题2:未等待QEMU监视器就绪

终端和expect脚本能正常工作,是因为它们会等待QEMU输出提示符(比如(qemu)或>)后再发送命令。而你的Java代码连接后立即发送命令,此时QEMU可能还没完成初始化、未准备好接收命令,导致命令被直接丢弃。

修复后的代码示例

try (Socket monitor = new Socket("127.0.0.1", port)) {
    // 先读取QEMU的欢迎信息,直到出现监视器提示符,确认就绪
    BufferedReader in = new BufferedReader(new InputStreamReader(monitor.getInputStream()));
    String line;
    while ((line = in.readLine()) != null) {
        // 匹配QEMU监视器的典型提示符
        if (line.contains("> ") || line.contains("(qemu)")) {
            break;
        }
    }

    // 发送正确的quit命令
    PrintWriter out = new PrintWriter(monitor.getOutputStream(), true);
    // 用println自动添加换行,或直接指定\r\n确保格式正确
    out.println("quit");
    // 若println的默认换行不符合要求,可替换为:
    // out.print("quit\r\n");
} catch( IOException e ) {
    e.printStackTrace();
}

补充说明

  • 如果你的系统默认换行符是\n,而QEMU要求\r\n,直接使用out.print("quit\r\n");能更精准控制命令格式。
  • 读取输入流的循环是关键,必须确保QEMU监视器完全就绪后再发送命令,这是对齐手动操作/expect脚本逻辑的核心步骤。

内容的提问来源于stack exchange,提问作者vit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:02:36