Я знаю, как перенаправить вывод и как подавить их в 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
linux
bash
io-redirection
gertvdijk
источник
источник
Ответы:
Вы можете сделать это с помощью reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Вы можете восстановить первоначальный вывод вашего процесса позже, используя что-то вроде:
(
<M>
и<N>
предоставляются при предыдущем запуске reredirect).Переадресация
README
также объясняет, как перенаправить на другую команду или перенаправить только stdout или stderr.источник
Это невозможно. Или, по крайней мере, не так просто. Возможно, вам повезет, подключив gdb к процессу и поигравшись с ним в gdb, но это может привести к сбоям так же легко, как и к успеху.
источник
Вы должны использовать reptyr, чтобы присоединить другой процесс к вашему текущему терминалу. Например: установите и используйте
screen
утилиту GNU , и в ней запуститеreptyr
команду для «извлечения» перенаправлений других процессов (и управляющего терминала) и присоедините их к новому текущему терминалу (screen
процессу, если вы запустилиreptyr
с негоscreen
). Преимущество выполнения этого вscreen
сеансе состоит в том, что послеscreen
этого будет легко отключиться и повторно подключиться к нему (например, закрыть локальный сеанс, вернуться домой и снова открыть его).источник