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

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
gertvdijk
источник
Поменять на другой терминал? Или в файл? Если вы довольны подключением к текущему терминалу или новому сеансу экрана, см. Раздел Как отречься от запущенного процесса и связать его с новой оболочкой экрана?
Жиль "ТАК - перестань быть злым"

Ответы:

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
В настоящее время для этого есть инструменты .
Жиль "ТАК - перестань быть злым"
Не стесняйтесь поделиться ими, я буду приветствовать ответ :)
Деннис Каарсемейкер
Гм, я уже сделал .
Жиль "ТАК ... перестать быть злым"
1
Не совсем. Все инструменты, связанные с другой ошибкой, предназначены для подключения к другому сеансу терминала / экрана. Не о перенаправлении в другой файл. Хотя, скорее всего, нетрудно пропатчить reptyr для перенаправления в файл.
Деннис Каарсемакер
Я немного заглянул в источник рептира и согласен больше всего с «непростой» частью ответа. Может быть, глубже погрузиться в это некоторое время спустя.
gertvdijk
2

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

Оливье Дюлак
источник
Спасибо за ваш ответ, но он не помогает мне в моем случае, так как я не спрашиваю об отсоединении / повторном подключении терминала. Пожалуйста, перечитайте мой вопрос и пример в частности.
gertvdijk
ах, в этом случае: прочитайте код reptyr, узнайте, как его изменить, чтобы перенаправить только stdout или stderr. Затем запустите его из другой оболочки, которая перенаправляет этот недавно присоединенный поток туда, куда вы хотите, чтобы он шел? (или, лучше, используя источник reptyr, сделайте перенаправление напрямую)
Оливье Дюлак