gpt4 book ai didi

Python线程中断终端

转载 作者:太空狗 更新时间:2023-10-29 11:18:28 26 4
gpt4 key购买 nike

你好 stackoverflow 的头脑,

我遇到了一个令人费解的错误。我有一个 python 脚本,它创建一个新线程,将 ssh 连接到远程机器并启动一个进程。但是,此过程不会自行返回(我希望它在我的脚本的整个持续时间内继续运行)。为了强制线程返回,在我的脚本结束时,我再次 ssh 进入机器并 kill -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 可以正常工作。但是,这是我在单独线程中运行的唯一一个,因为它是唯一一个不返回的线程。我需要保持在我的脚本完成时关闭远程机器进程的能力。

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

提前致谢。

最佳答案

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

解决这个问题的一种方法是使用 python-module pexpect(它是一个第 3 方库)来启动你的进程,因为它会创建你自己的假 tty,你不知道不关心。

顺便说一句,要“修复”您的终端,请使用reset 命令。正如您已经注意到的,您可以输入命令。 reset 会将终端设置为默认设置。

关于Python线程中断终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30878871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com