java - jmx-term python 子进程毒害 shell

标签 java python jmx

#!/usr/bin/env python

from subprocess import *

p = Popen(
  args=("java","-jar","jmxterm-1.0-alpha-4-uber.jar"), 
  bufsize=0, 
  stdin=PIPE,
  stderr=PIPE
  )

p.stdin.write("open localhost:12345\n")
x = p.stderr.readline()

这需要一个 java 进程在端口 12345 上监听 jmx 客户端。 脚本“works”: x 是正确的(当您打印它或在 pdb 中查看它时)。

那么问题是什么?当这个脚本终止时,shell 的行为很奇怪。在 Linux 和 OS-X 上,在 shell 中键入内容是不可见的(尽管输出可见),而在 Windows 上,每个命令键入的前两个字符将被忽略。执行终端“重置”命令似乎可以修复它,但我不想让我的脚本的用户遭受这种情况。

删除脚本的最后一行(访问 p.stderr.readline())可以消除问题,也可以消除脚本的实用程序。

我删除了身份验证以简化示例。您会注意到,我没有打印 x,以避免向 shell 写入一些令人讨厌的内容作为罪魁祸首。

版本:Snow Leopard 和各种 Linux 上的 CPython 2.7; Windows 7 上的 CPython 2.6.3

最佳答案

jmxterm 可能正在为终端上的交互式使用进行一些初始化,或者是因为错误,或者是因为您没有明确关闭它,所以它不会自行清理。避免这种情况的最简单方法可能是将其 STDOUT 也连接到 PIPE,就像对其他标准流所做的那样。

关于java - jmx-term python 子进程毒害 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817544/

相关文章:

java - 在 Gridlayout Java Swing 中显示数组列表项

java - catalina.out 出现异常时发送邮件

java - 递归搜索Java中的目录

rmi - JMX RMI 代理容错机制

java - 监控分布在多台服务器上的一个应用程序

Java基本并发通信器-不完全接受连接

python - 将数据从 `tf.data.Dataset` 分发给多个工作人员(例如 Horovod)

python - smtp错误534连接到gmail python3

具有预填充环境的 Python 子进程模块

hadoop - JMX导出Mapreduce指标