Я думаю, що це можливо, якщо ви додасте процес відповідного інтерпретатора до gdb. Я спробував це за допомогою одного перламутрового Perl
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
поданий сценарій процесу (для stdout
файлового сценарію - 1)
call open(...)
відкриває новий файл і приймає найменше невикористане ціле число для новоствореного файлового сценарію та
detach PID
продовжує процес
Принаймні, на моїй машині. Перші два рядки сумісні з POSIX, але не третій.
Другий та третій аргументи open
третього рядка задокументовані у man 2 open
. У моєму випадку 65 означає, що open
слід створити файл і відкрити файл лише для запису, тобто O_WRONLY | O_CREAT
(визначено в fcntl.h
). Третій аргумент говорить відкрито створити файл із дозволом для читання та запису для користувача, тобто S_IWUSR | S_IRUSR
(визначено в sys/stat.h
). Тож, можливо, вам доведеться самостійно з’ясувати відповідні значення на вашій машині.