gpt4 book ai didi

python - Paramiko:使用 'select' 异步读取长 shell 脚本输出

转载 作者:行者123 更新时间:2023-12-01 05:08:17 24 4
gpt4 key购买 nike

我有来自 here 的以下代码稍作修改:

#!/usr/bin/env python                                                  

import paramiko
import select


server = "192.168.100.100"
port = 22
name = "root"
password = "pass"


def main():
client = paramiko.SSHClient()
client.load_system_host_keys()

client.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())
client.connect(server, port, name, password)

channel = client.get_transport().open_session()
channel.exec_command("/tmp/test.sh")

while True:
if channel.exit_status_ready():
break

r, w, x = select.select([channel], [], [], 0.0)
if len(r) > 0:
print channel.recv(1024)

if __name__ == "__main__":
main()

其中test.sh有以下内容:

#!/usr/bin/env bash
while true
do
echo "Message"
sleep 1
done

因此,执行 python 脚本后,脚本的 CPU 使用率上升到 100%。这意味着此选择函数不会等到一个或多个文件描述符准备好进行某种 I/O。据了解,这是一个繁忙的循环问题,其中“while ...循环”将连续迭代,即使没有提供读取的数据。如何使其异步读取远程输出?

最佳答案

您的问题是您在选择时将超时设置为 0 秒,因此它根本不会阻塞。默认值是根据需要阻塞,因此要么从 select 中取出超时参数,要么将其更改为更大的值:

r, w, x = select.select([channel], [], [])

r, w, x = select.select([channel], [], [], 10.0)

您可以看到 CPU 方面的差异,也可以通过在 while true 之后放置一个简单的打印语句来看到差异。在 0.0 秒超时语句中,您会看到它连续命中。在更大的超时情况下,您会看到它恰好命中一次(并且 cpu 低得多)。

关于python - Paramiko:使用 'select' 异步读取长 shell 脚本输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24672844/

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