Що відбувається з результатом процесу, який відмовився і втратив свій термінал?


26

Якщо я закрию віртуальний термінал, де був запущений якийсь процес, чи буде вихід просто прямим /dev/null, чи він може якось забруднити пам'ять? Чи можу я як-небудь захопити вихід, щоб продовжити його читання в будь-який момент після цього?

[EDIT]: Отже, чи фактично момент відмови від процесу є кінцем моєї сили контролювати його результати?

Я також помітив, що якщо я відмовився від зупиненого процесу, то спочатку все здається нормальним: він не припиняється і не показується в робочих місцях. Але якщо я вийду (і я не маю на увазі закрити термінал, просто вийти з нього su, наприклад), процес припиняється. Тим не менш, фоновий процес відмовлений може продовжувати працювати.


2
Для "чи можу я як-небудь захопити результат": не без брудних хитрощів. Але див. Як я можу відмовитись від запущеного процесу та пов’язати його з новою оболонкою екрана? та інші цитовані запитання щодо брудних хитрощів (усі засновані на приєднанні налагоджувача до програми і якимось чином змушує його відкрити інший вихідний файл).
Жил 'ТАК - перестань бути злим'

Дякуємо за посилання на це питання. Це дало мені найкращу відповідь поки! Особливо розумна rettyпрограма.
rozcietrzewiacz

1
Дивіться також цю відповідь на пов'язане питання.
Стефан Гіменез

Відповіді:


11

Те, що процес "відхилений", має значення лише для інтерактивної оболонки, яка створила цей процес. Це означає, що оболонка не включає (більше) процес у свою таблицю завдань, і SIGHUP не буде відправлений до цього процесу, коли оболонка вийде. Це насправді не пов’язано з вашими питаннями.

Про те, що відбувається з виходами, які надсилаються до видаленого віртуального терміналу: я зробив декілька тестів, і я помітив, що /dev/pts/xпристрої недоступні і не будуть виділятися знову, поки всі файлові сценарії, які вказують на них, не будуть закриті. Отже, я не бачу причини, чому запис на видалений термінал буде зберігатися. Я думаю, це навіть не визначено POSIX.

Щодо захоплення виводу якогось процесу, який записується в термінал, я не думаю, що це можливо, навіть коли термінал ще живий¹. Все, що ви можете зробити - це захопити прямий вхід до терміналу (тобто натискання клавіш або симульовані натискання клавіш головною частиною pty). Якщо процеси читають на stdin те, що записується на їх термінали, це призвело б до циклу самоізоляції для більшості процесів.

Щодо останнього зауваження про припинення процесу, я не знаю, що відбувається, але я б підозрював досить дивні поведінки з сигналами (SIGTTOU, SIGTTIN, SIGHUP або іншими), пов’язаними із станом переднього плану / фонового стану під час сесії лідер виходить (наприклад su, у випадку, про який ви згадали).

Відповідь на " Правка": Ні, щодо виводу, нічого не змінюється, коли процес відключений: він як і раніше приєднаний до свого керуючого терміналу (якщо тільки він не від'єднався вже так, як це роблять демони). Ви можете бачити це, використовуючи ps. Однак ви більше не зможете використовувати fg/ bg/ jobsкоманди, надані оболонкою для цього процесу. Це означає, що може бути важко подати його на вхід з терміналу (вимагає бути у передній групі процесів).

-
1. за винятком випадків, коли процес не бажає або не викрадений деякими інструментами налагодження (див. Коментарі вище).


1
Дякуємо, що трохи уточнили це. Насправді факт відмови в процесі все ще пов'язаний з моїм питанням: Після відмови від процесу я, здається, втрачає можливість контролювати його вихід, правда? (Навіть якщо термінал є ніт закритий.) Я відредагую питання, щоб включити цей випадок.
rozcietrzewiacz

4

Просто для вирішення цього конкретного питання:

Якщо я закриваю віртуальний термінал, де був запущений якийсь процес, чи буде висновок просто переходити до / dev / null, чи він може якось забруднити пам'ять?

Термінал та програми, підключені до нього, спілкуються через tty-пристрій, читаючи та записуючи його як файл. Зокрема, віртуальний термінал створює "pseudo-tty" ("pty" коротко), а потім породжує процес оболонки (або інший) і з'єднує stdin / out / err цього процесу з pty. (Деталі залежать від операційної системи.)

Коли ви закриваєте віртуальний термінал, віртуальний термінал закриває свій кінець з'єднання (pty "master"). Після цього, якщо програма на іншому кінці з'єднання пише в tty, повертається помилка і дані нікуди не дістаються. Аналогічно, якщо він зчитує з tty, він поверне показник EOF (кінець файлу).


Спасибі - приємне і чітке пояснення з трохи більше програмової точки зору.
rozcietrzewiacz

3

Щоб відповісти на найцікавішу частину вашого запитання: щоб змінити висновок живої програми, вам потрібно відредагувати її дескриптори файлів. Це дуже просто зробити з gdb. Це хак, але працює.

Побачити:

/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

Довідковий сценарій доступний на веб-сторінці http://users.linpro.no/ingvar/fdswap.sh.txt .


0

Завдяки коментарю Жилла, вказуючи мені на це питання , я дізнався про програму під назвою retty .

Здається, використовувати деякий брудний злом, щоб приєднатись до (псевдо-) tty, що ефективно дозволяє продовжувати читати вихідний процес - незалежно від того, відмовився він чи ні. Отже, це, здається, відповідає на більшість першої частини мого запитання. На другий відповів Стефан .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.