Я просто запускаю задание (допустим, 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
)