Перенаправить stdout/stderr фонового задания из консоли в файл журнала?
Я просто запускаю работу (предположим, foo.sh).
./foo.sh
[Press Ctrl-Z to stop]
bg # enter background
И это генерирует вывод в stdout и stderr. Есть ли способ перенаправить на stdout и stderr в другой файл вместо текущего экрана?
1 ответ
Решение
Видимо, я неправильно понял ваш вопрос в первый раз, поэтому вот мой обновленный ответ:
После того, как вы отправили свою программу в фоновый режим, вам сначала нужно найти ее PID
pgrep foo.sh
Тогда вы могли бы использовать gdb
присоединиться к этому процессу
gdb -p <PID>
В gdb
Затем вы меняете, куда пишет эта программа
p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)
затем вы отсоединяетесь от процесса и выходите gdb
detach
quit
Небольшое объяснение
577
эквивалентноO_CREAT|O_WRONLY|O_TRUNC
420
эквивалентноS_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
- Так что призыв к
open
открывает файл и усекает его до 0 байт, если он существует, или создает новый с правильными правами доступа к файлу, если он не существует - Первый звонок
dup2
дублирует дескриптор файла, возвращаемый при вызовеopen
к файловому дескриптору1
(которыйstdout
) - Второй звонок
dup2
дублирует дескриптор файла1
в2
(которыйstderr
)