jmx-term Python 子进程污染 Shell

1 投票
2 回答
1106 浏览
提问于 2025-04-16 04:43
#!/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客户端。

那问题出在哪里呢? 当这个脚本结束时,命令行的表现就很奇怪。在Linux和OS-X上,输入的内容看不见(虽然输出是可以看到的),而在Windows上,每个命令输入的前两个字符会被忽略。执行终端的“reset”命令似乎能解决这个问题,但我不想让使用我脚本的人遇到这个麻烦。

如果去掉脚本的最后一行(访问p.stderr.readline()),问题就消失了,但这样也失去了脚本的功能。

我去掉了认证部分,以简化这个例子。你会注意到我没有打印x,以避免把一些不好的东西写到命令行上,造成误解。

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

2 个回答

0

jmxterm 是一个可以在你的终端上执行操作的工具。最简单的做法就是让 jmxterm 能够正常退出,这样它就能自己清理干净。

p.stdin.write('quit\n')
p.wait()
2

jmxterm 可能在终端上进行一些初始化,以便进行交互式使用。可能是因为有个小错误,或者你没有明确关闭它,所以它没有自己清理干净。避免这种情况最简单的方法就是像处理其他标准输出流一样,把它的标准输出(STDOUT)连接到一个管道(PIPE)上。

撰写回答