Все ли процессы Linux записывают EOF в stdout при завершении/завершении завершения?

Все ли процессы Linux записывают EOF в stdout при завершении/завершении завершения?

У меня возникли проблемы с отправкой 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>.

Источник:9.5 Мониторинг и отключение контейнеров

решение2

EOF указывает, что не ожидается дальнейшего ввода на ресурсе, который, возможно, предоставляет бесконечное количество данных (например, поток). Эта ситуация часто выражается записью одного символа в поток (который будет определен базовой системой (вероятно, ОС или средой выполнения)).

Поскольку процессы используют потоки для межпроцессного взаимодействия, им необходимо указывать пределы своего вывода, а отправляющим процессам необходимо указывать пределы своего ввода с помощью EOF. Базовая система наверняка перенаправит этот ввод и вывод в свои собственные механизмы обработки процессов, сделав EOF доступным для оценки в программе/в системе.

Примечание о pexpectварианте использования в вопросе: shutil.pexpectпохоже, не подходит для копирования файлов контейнера lxc. Он застрял, а смещение времени вывода pexpectвызывает путаницу.

Связанный контент