Python线程破坏终端

时间:2015-06-16 21:49:24

标签: python linux

你好想想stackoverflow,

我遇到了一个令人困惑的错误。我有一个python脚本,它创建一个新线程,ssh进入远程机器并启动进程。但是,此过程不会自行返回(我希望它在整个脚本期间保持运行)。为了强制线程返回,在我的脚本结束时,我再次进入机器并杀死-9进程。这很好用,期望它打破终端。

要启动该线程,我运行以下代码:

t = threading.Thread(target=run_vUE_rfal, args=(vAP.IP, vUE.IP))
t.start()

函数run_vUE_rfal如下:

cmd = "sudo ssh -ti ~/.ssh/my_key.pem user@%s 'sudo /opt/company_name/rfal/bin/vUE-rfal -l 3 -m -d %s -i %s'" % (vUE_IP, vAP_IP, vUE_IP)
output = commands.getstatusoutput(cmd)
return

似乎在命令运行时,它以某种方式打破了我的终端。它被打破了,而不是为每个打印创建一个新行,它将我的终端的WIDTH以空白方式附加到每行的末尾,并将其打印为看似一个长字符串。此外,我无法看到我的键盘输入到该终端,但它仍然成功读取。我的终端看起来像这样:

normal formatted output
normal formatted output
running vUE-rfal
print1
      print2
            print3_extra_long
                             print4

如果我用一些简单的打印替换run_vUE_rfal函数的主体,终端不会中断。我在这个脚本中有很多其他的ssh和telnet工作正常。但是,这是我在一个单独的线程中运行的唯一一个,因为它是唯一一个不返回的线程。我的脚本完成后,我需要保持关闭远程机器进程的能力。

对修复原因和想法的任何解释都非常感谢。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您控制的过程似乎正在改变终端设置。这些是绕过 stderr和stdout - 这是有充分理由的。例如。即使正在重定向输出,ssh本身也需要这个来询问用户密码。

解决这个问题的方法可能是使用python-module pexpect(它是第三方库)启动您的流程,因为它会创建它的'拥有你不在乎的假货。

顺便说一下,去修理"您的终端,使用reset命令。正如您已经注意到的,您可以输入命令。 reset会将终端设置为默认设置。