Как изменить перенаправление вывода запущенного процесса?


11

Я знаю, как перенаправить вывод и как подавить их в bash. Теперь предположим, что я случайно забыл добавить часть перенаправления вывода в команду (например, 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>предоставляются при предыдущем запуске reredirect).

Переадресация READMEтакже объясняет, как перенаправить на другую команду или перенаправить только stdout или stderr.


3

Это невозможно. Или, по крайней мере, не так просто. Возможно, вам повезет, подключив gdb к процессу и поигравшись с ним в gdb, но это может привести к сбоям так же легко, как и к успеху.



Не стесняйтесь поделиться ими, я буду приветствовать ответ :)
Деннис Каарсемейкер


1
Не совсем. Все инструменты, связанные с другой ошибкой, предназначены для подключения к другому сеансу терминала / экрана. Не о перенаправлении в другой файл. Хотя, скорее всего, нетрудно пропатчить reptyr для перенаправления в файл.
Деннис Каарсемакер

Я немного заглянул в источник рептира и согласен больше всего с «непростой» частью ответа. Может быть, глубже погрузиться в это некоторое время спустя.
gertvdijk

2

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


Спасибо за ваш ответ, но он не помогает мне в моем случае, так как я не спрашиваю об отсоединении / повторном подключении терминала. Пожалуйста, перечитайте мой вопрос и пример в частности.
gertvdijk

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