Перенаправить stdout/stderr фонового задания из консоли в файл журнала?

Перенаправить 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)

Связанный контент