你好想想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工作正常。但是,这是我在一个单独的线程中运行的唯一一个,因为它是唯一一个不返回的线程。我的脚本完成后,我需要保持关闭远程机器进程的能力。
对修复原因和想法的任何解释都非常感谢。
提前致谢。
答案 0 :(得分:1)
您控制的过程似乎正在改变终端设置。这些是绕过 stderr和stdout - 这是有充分理由的。例如。即使正在重定向输出,ssh本身也需要这个来询问用户密码。
解决这个问题的方法可能是使用python-module pexpect
(它是第三方库)启动您的流程,因为它会创建它的'拥有你不在乎的假货。
reset
命令。正如您已经注意到的,您可以输入命令。 reset
会将终端设置为默认设置。