Як змінити перенаправлення виводу запущеного процесу?


11

Я знаю, як перенаправляти вихідні дані та як їх придушити в баш. Тепер, припустимо, я випадково забув додати частину переадресації виводу до команди (наприклад, 2>&1або > /tmp/mystdout), і мій фоновий процес вже працює на деякий час, чи можу я все-таки змінитись, куди stdoutі stderrв яке записування? Я дуже хотів би не вбивати та перезавантажувати додаток.

Щоб бути більш конкретним, як запитав Гілл у своєму коментарі, я хотів би конкретно поспілкуватися з цим сценарієм:

  • неправильний вихідний файл
  • забув перенаправити stderrдоstdout

або поєднання обох

Наприклад, у мене запущений Apache, і я бачу дескриптори файлів:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

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

Відповіді:


8

Це можна зробити за допомогою reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Пізніше ви можете відновити вихідний результат свого процесу, використовуючи щось на зразок:

reredirect -N -O <M> -E <N> <PID>

( <M>і <N>надаються попереднім запуском перенаправлення).

перенаправлення READMEтакож пояснює, як перенаправити на іншу команду або перенаправити лише stdout або stderr.


3

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



Не соромтеся поділитися ними, я підтримаю відповідь :)
Dennis Kaarsemaker


1
Не зовсім. Усі інструменти, пов’язані з іншою помилкою, стосуються приєднання до іншого сеансу терміналу / екрана. Не про переадресацію до іншого файлу. Хоча, мабуть, не важко виправити рептир, щоб переадресувати на файл.
Денніс Каарсемейкер

Я трохи заглянув у джерело рептирію, і я згоден з більшою частиною відповіді "непростою". Можливо, глибше пірнути в нього через деякий час.
gertvdijk

2

Вам слід скористатися рептилієм, щоб приєднати ще один процес до нового поточного терміналу. Наприклад: встановіть і використовуйте screenутиліту GNU , і в ній запустіть reptyrкоманду "отримати" перенаправлення іншого процесу (і керуючого терміналу) та приєднайте їх до нового поточного терміналу ( screenпроцес, якщо ви запущені reptyrз screen). Перевага робити це з screenсеансу полягає в тому, що, потрапивши в режим screen, тоді буде легко відключити і знову підключитися до нього (наприклад, закрити локальний сеанс, повернутися додому та повторно відкрити його).


Дякую за вашу відповідь, але це не допомагає мені у моєму випадку, оскільки я не запитую про відключення / повторне використання терміналу. Будь ласка, перечитайте моє запитання та конкретний приклад.
gertvdijk

ах, у такому випадку: прочитайте код перезапису, дізнайтеся, як його змінити, щоб перенаправити лише stdout або stderr. Потім запустіть його з іншої оболонки, яка перенаправляє цей нещодавно приєднаний потік туди, куди ви хочете? (або, краще, використовуючи джерело рептирію, перейдіть безпосередньо)
Олів'є Дулак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.