Я использую модуль pty Python для запуска команд SSH и rsync (python 2.7, CentOS Linux выпуск 7.3.1611 (Core)).Код выглядит примерно так:
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
Как видите, строка обрезается.Часть "debug poll" - это мой отладочный отпечаток, чтобы увидеть, какое событие произошло.1
указывает, что это было событие select.POLLIN
.
Я подозреваю, что это может быть связано с размером буфера или чем-то другим.Я обычно не работаю с подобными вещами низкого уровня, поэтому любая помощь будет оценена.
ОБНОВЛЕНИЕ: Я попытался запустить rsync с флагом -q, который не дает никакого выводаи это работает.Я все еще хотел бы иметь возможность получать выходные данные для других случаев использования (например, различных команд SSH), поэтому я не думаю, что это правильное решение.