Если это ...
process = subprocess.Popen("ssh -t -A $host 'remote_command'",
shell=True,
stdin=subprocess.PIPE)
for line in file('/tmp/foo'):
process.stdin.write(line)
process.stdin.flush()
process.stdin.close()
... это вся ваша программа, она не будет (обязательно) работать.
Хотя последний вызов process.stdin.close()
гарантирует, что все данные были отправлены в процесс ssh
до завершения вашей программы, он не будет гарантировать, что процесс ssh
отправил все данные по сети так что вполне может быть несколько выдающихся данных для отправки.
К сожалению, поскольку процесс ssh
является дочерним процессом вашей программы, то, когда ваша программа завершает работу, процесс ssh
получит SIGHUP
, который немедленно уничтожит его, возможно, до того, как он завершит отправку всех своих данных .
Пока remote_command
завершается при достижении EOF, это не проблема, и вы можете либо попросить процесс ssh
игнорировать SIGHUP
, и продолжить работу в фоновом режиме с ...
process = subprocess.Popen("nohup ssh -t -A $host 'remote_command'", ...)
... или попросите вашу программу дождаться завершения процесса ssh
, добавив ...
process.wait()
... до конца вашей программы.
Обновление
При дальнейшем рассмотрении похоже, что процесс получает SIGHUP
только в том случае, если завершается его управляющий tty, а не родительский процесс.
Это может быть связано с параметром -t
, который создает новый управляющий tty на удаленном хосте, и он завершается до завершения подпроцесса, который он порождает.
В этом случае вам может понадобиться ...
process = subprocess.Popen("ssh -t -A $host 'nohup remote_command'", ...)
... или попробуйте без опции -t
.