Перенаправить stderr из уже запущенного скрипта

Я уже несколько дней запускаю скрипт. Я перенаправил stdout на $HOME/mylog , но не перенаправлял stderr, так как думал, что на нем ничего не будет. Внезапно на stderr вышли тысячи линий, поэтому я приостановил работу. Есть ли способ, с которого я могу перенаправить stderr в $HOME/myerr с этого $HOME/myerr , без перезапуска скрипта?

У меня есть sudo доступ на коробке, и это OS X.

Возможно, что-то, использующее dtools trapping?

Я не могу потерять работу, которую сценарий сделал до сих пор, и перезапустить ее с нуля. Есть ли способ «сбрасывать объекты в памяти» на диск, замораживать программу, редактировать переменные (например, дескрипторы файлов) и возобновлять их с помощью нового контекста?

  • Как сделать скрытые команды оболочки невидимыми?
  • Использование тайм-аута GNU при перенаправлении stdout в файл
  • Как перезаписать stdout с помощью эха?
  • Система больше не выводит символы UTF-8
  • Перенаправление stdin с stdout в файл
  • Как Bash получает результат выполнения программы?
  • Как ограничить количество строк выходом команды в bash?
  • Как сохранить распечатку последней команды в переменной оболочки в urxvt / zsh?
  • 2 Solutions collect form web for “Перенаправить stderr из уже запущенного скрипта”

    Я думаю, что это возможно, если вы присоедините процесс связанного интерпретатора к gdb. Я попробовал это с помощью этого perl one-liner

      perl -e 'do { print "x\n"; sleep(1) } while(1)' 

    и он работает, но, к сожалению, не с похожим сценарием bash.


    Прежде всего, вам нужно выяснить PID этого процесса, выход которого вы хотите захватить. Затем запустите gdb в другом терминале и выполните следующие команды gdb

     attach PID call close(2) call open("/abs/olu/te/path/filename", 65, 384) detach PID 

    после этого все данные, которые записываются в stderr , перенаправляются в /abs/olu/te/path/filename , поскольку

    • attach PID присоединяет процесс к gdb и останавливает его
    • call close(2) закрывает stderr filedescriptor процесса (для stdout filedescriptor равен 1)
    • call open(...) открывает новый файл и берет наименьшее неиспользованное целое число для вновь созданного filedescriptor и
    • detach PID продолжает процесс

    По крайней мере, на моей машине. Первые две строки совместимы с POSIX, но не с третьей.

    Второй и третий аргументы open в третьей строке задокументированы в man 2 open . В моем случае 65 означает, что open должен создать файл и открыть файл только для записи, т. O_WRONLY | O_CREAT O_WRONLY | O_CREAT (определяется в fcntl.h ). Третий аргумент говорит open для создания файла с правами чтения и записи для пользователя, то есть S_IWUSR | S_IRUSR S_IWUSR | S_IRUSR (определяется в sys/stat.h ). Так что, может быть, вам нужно самостоятельно найти соответствующие значения на вашей машине.

    Это грубый ответ, и я надеюсь, что кто-то другой сделает лучше, но, если нет других идей, присоедините gdb и заставите процесс сделать несколько системных вызовов:

     (gdb) attach 12345 # target PID (gdb) p close(2) (gdb) p open("errfile", O_WRONLY) (gdb) c 
    Interesting Posts

    Принимайте несколько дистрибутивов Linux на сервере PXE и ​​показывайте эти варианты для клиента PXE

    Как проверить, установлен ли раздел как «noexec»?

    Разделить текстовый файл в случайных половинах по категории

    Как работает перенаправление этой команды?

    удалить строки в файле list_file из другого файла (ов)

    Как mv и принимать разрешения целевого каталога

    SELinux не позволяет oddjobd-mkhomedir создавать пользовательский домашний каталог в нестандартном месте

    Ansible – настройка экземпляра AWS EC2 после его создания

    SSH «спать» в течение долгого времени, прежде чем подключиться?

    Как вы можете перемещать файл в качестве фонового задания и удалять все остальные файлы и каталог перед ожиданием завершения задания?

    Использование cut / awk / sed с двумя разными разделителями

    Настройка часового пояса системы на основе временной метки

    Получить имя файла после find -name | xargs

    Передача переменной в скрипт bash, который использует «EOF» и рассматривает переменную буква

    Где Linux хранит журналы сетей Wi-Fi при поиске? Это вообще?

    Linux и Unix - лучшая ОС в мире.