Redirecionar stdout/stderr de um trabalho em segundo plano do console para um arquivo de log?

Redirecionar stdout/stderr de um trabalho em segundo plano do console para um arquivo de log?

Acabei de executar um trabalho (suponha foo.sh).

./foo.sh
[Press Ctrl-Z to stop]
bg  # enter background

E gera saída para stdout e stderr. Existe algum método para redirecionar para stdout e stderr para outro arquivo em vez da tela atual?

Responder1

Aparentemente, interpretei mal sua pergunta na primeira vez, então aqui está minha resposta atualizada:

Depois de enviar seu programa para segundo plano, primeiro você precisa encontrar seu PID

pgrep foo.sh

Então você poderia usar gdbpara anexar a esse processo

gdb -p <PID>

Em gdbvocê, então, mude para onde este programa grava

p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)

então você se desliga do processo e saigdb

detach
quit

Uma pequena explicação

  • 577é equivalente aO_CREAT|O_WRONLY|O_TRUNC
  • 420é equivalente aS_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
  • Portanto, a chamada para openabre o arquivo e o trunca para 0 bytes, se existir, ou cria um novo com as permissões de arquivo corretas, se não existir.
  • A primeira chamada para dup2duplica o descritor de arquivo retornado pela chamada para openo descritor de arquivo 1(que é stdout)
  • A segunda chamada para dup2duplicar o descritor de arquivo 1para 2(que é stderr)

informação relacionada