Если я закрою виртуальный терминал, где был запущен какой-то процесс, вывод просто пойдет прямо /dev/null
или он каким-то образом загрязнит память?
Могу ли я как-нибудь получить вывод, чтобы продолжить чтение в любой момент после этого?
[РЕДАКТИРОВАТЬ]: Итак, действительно ли момент отказа от процесса - конец моей власти контролировать его результаты?
Я также заметил, что если я отрекаюсь от остановленного процесса, сначала все кажется нормальным: он не завершается и не отображается в заданиях. Но если я выйду из системы (и я не имею в виду закрыть терминал, например, просто выйду из su
), процесс завершится. Тем не менее, фоновый запущенный процесс может остаться запущенным.
terminal
process
io-redirection
job-control
disown
rozcietrzewiacz
источник
источник
retty
программа.Ответы:
Тот факт, что процесс «отвергнут», имеет значение только для интерактивной оболочки, создавшей этот процесс. Это означает, что оболочка (больше) не включает процесс в свою таблицу заданий и что SIGHUP не будет отправляться этому процессу при выходе из оболочки. Это на самом деле не связано с вашими вопросами.
О том, что происходит с выходными данными, которые отправляются на удаленный виртуальный терминал: я сам провел несколько тестов и заметил, что
/dev/pts/x
устройства недоступны и не будут распределяться снова, пока все файловые дескрипторы, которые указывают на них, не будут закрыты. Итак, я не вижу причины, по которой записи в удаленный терминал будут сохранены. Я предполагаю, что это даже не определено POSIX.Насчет вывода какого-либо процесса, который пишет в терминал, я не думаю, что это возможно, даже когда терминал еще жив ». Все, что вы можете сделать, это захватить прямой ввод на терминал (т.е. нажатия клавиш или симулированные нажатия клавиш основной частью pty). Если бы процессы читали на stdin то, что записано на их терминалы, это привело бы к циклу self io для большинства процессов.
Что касается последнего замечания о завершении процесса, я действительно не знаю, что происходит, но я подозреваю довольно странное поведение с сигналами (SIGTTOU, SIGTTIN, SIGHUP или другими), связанными с основным / фоновым состоянием групп процессов, когда сеанс Лидер выходит (например
su
, в случае, вы упомянули).Ответ на редактирование: Нет, что касается вывода, ничего не меняется, когда процесс отсоединяется: он все еще подключен к своему управляющему терминалу (если только он не отключился, как это делают демоны). Вы можете увидеть это, используя
ps
. Однако вы больше не сможете использоватьfg
/bg
/jobs
команды, предоставленные оболочкой для этого процесса. Это означает, что это может быть затруднительно для подачи данных с терминала (требуется быть в группе процессов переднего плана).-
1. если процесс не хочет или не угнан какими-либо инструментами отладки (см. Комментарии выше).
источник
Просто для решения этого конкретного вопроса:
Терминал и программа (и), связанные с ним, обмениваются данными через устройство tty, читая и записывая его как файл. В частности, виртуальный терминал создает «псевдо-tty» (для краткости «pty»), а затем порождает процесс оболочки (или другой) и подключает stdin / out / err этого процесса к pty. (Детали зависят от операционной системы.)
Когда вы закрываете виртуальный терминал, виртуальный терминал закрывает свой конец соединения (pty "master"). После этого, если программа на другом конце соединения пишет в tty, возвращается ошибка, и данные никуда не уходят. Точно так же, если он читает из tty, он вернет индикатор EOF (конец файла).
источник
Чтобы ответить на самую интересную часть вашего вопроса: чтобы изменить вывод работающей программы, вы должны отредактировать дескрипторы файлов. Это довольно легко сделать с GDB. Это взлом, но работает.
Видеть:
/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line
Вспомогательный скрипт доступен по адресу http://users.linpro.no/ingvar/fdswap.sh.txt .
источник
Благодаря комментарию Жиля, указавшему мне на этот вопрос , я узнал о программе под названием retty .
Кажется, что он использует какой-то грязный хак для повторного присоединения к (псевдотерминалу), эффективно позволяющего продолжить чтение вывода процесса - независимо от того, был ли он отринут или нет. Так что это, кажется, отвечает на большую часть первой части моего вопроса. На второй ответил Стефан .
источник