
У меня возникли проблемы с отправкой shutdown -h 0
в lxc
контейнер Debian (т. е. выполнением этой команды в lxc) с pexpect
модулем python (в скрипте python). В этом модуле пользователь может "ожидать" (= ждать вывода процесса) определенную подстроку, среди прочих EOF, что приводит меня к вопросу, чтобы иметь возможность дальнейшей отладки, почему EOF не распознается в выводе. Мне нужно знать, чего я могу "ожидать" после завершения процесса, чтобы дождаться его завершения. Я не могу просто дождаться завершения процесса, потому что модуль pexpect
скрывает неблокирующие функции для этого.
Модуль pexpect
(см.http://www.bx.psu.edu/~nate/pexpect/pexpect.html#pexpect.spawn.expectдля получения подробной информации) оборачивает прием EOF в системном вызове read в (утиный)тип и делает его пригодным для использования в pexpect.expect
(инкапсуляции возможного вывода/обратной связи процесса).
Я задавался вопросом, поскольку некоторые процессы, как ls
ожидается, завершаются с EOF, т.е. pexpect
смысл EOF (пример наhttp://pexpect.sourceforge.net/pexpect.html).
решение1
Вместо того, чтобы запускать эту shutdown -h 0
команду, я бы предложил запустить halt
или запустить эту команду с хоста, lxc-shutdown -n <name>
.
решение2
EOF указывает, что не ожидается дальнейшего ввода на ресурсе, который, возможно, предоставляет бесконечное количество данных (например, поток). Эта ситуация часто выражается записью одного символа в поток (который будет определен базовой системой (вероятно, ОС или средой выполнения)).
Поскольку процессы используют потоки для межпроцессного взаимодействия, им необходимо указывать пределы своего вывода, а отправляющим процессам необходимо указывать пределы своего ввода с помощью EOF. Базовая система наверняка перенаправит этот ввод и вывод в свои собственные механизмы обработки процессов, сделав EOF доступным для оценки в программе/в системе.
Примечание о pexpect
варианте использования в вопросе: shutil.pexpect
похоже, не подходит для копирования файлов контейнера lxc
. Он застрял, а смещение времени вывода pexpect
вызывает путаницу.