Перенаправить 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)
Другие вопросы по тегам