我正在使用Python的pty模块运行SSH和rsync命令(python 2.7,CentOS Linux版本7.3.1611(核心))。代码是这样的:
self.pid, self.child_fd = pty.fork()
if self.pid == 0:
os.execv(self.command[0], self.command)
后来我在阅读之前从父进程中进行了一次民意测验:
def check_poll(fds):
poller = select.poll()
for fd in fds:
poller.register(fd, select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR)
while True:
results = poller.poll(timeout_ms)
return [afd for afd, _ in results]
if check_poll([child_fd]):
os.read(child_fd, 1024) <--- This is where it hangs
我也处理超时问题,但目前无关紧要。
在运行复制大量文件的rsync命令时,它总是挂起。在复制大约相同数量的文件后(根据我使用的打印件),它始终挂起。它提供的输出永远不会是整行,例如:
debug poll: [(15, 1)]
lib/libpangoxft-1.0.la
debug poll: [(15, 1)]
lib/libpangoxft-1.0.so -> libpangoxft-1.0.so.0.3600.8
lib/libpangoxft-1.0.so.0 -> libpangoxft-1.0.so.0.3600.8
lib/libpa
如您所见,该行被切断。 “调试轮询”部分是我的调试打印,以查看发生了什么事件。 1
表示这是一个select.POLLIN
事件。
我怀疑这可能与缓冲区大小有关。我通常不使用这种低级的东西,所以任何帮助将不胜感激。
更新:我尝试使用-q标志运行rsync,该标志不提供任何输出,并且可以正常运行。我仍然希望能够获得其他用例(例如各种SSH命令)的输出,因此我认为这不是有效的解决方案。