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

7

Acabei de executar um trabalho (assuma 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?

Daniel YC Lin
fonte
Traga-o para FG, redirecione a saída e envie-a de volta para BG.
alfasin

Respostas:

13

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

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

pgrep foo.sh

Então você poderia usar gdb para anexar a esse processo

gdb -p <PID>

Em gdb você então muda onde este programa grava

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

então você se desconecta do processo e sai gdb

detach
quit

Uma pequena explicação

  • 577 é equivalente a O_CREAT|O_WRONLY|O_TRUNC
  • 420 é equivalente a S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
  • Então a chamada para open abre o arquivo e trunca-o para 0 bytes se existir ou cria um novo com as permissões de arquivo corretas, se não existir
  • A primeira chamada para dup2 duplica o descritor de arquivo retornado pela chamada para open para descritor de arquivo 1 (qual é stdout )
  • A segunda chamada para dup2 duplica o descritor de arquivo 1 para 2 (qual é stderr )
neocrow
fonte
1
-1. Não responde a pergunta que foi feita. Especificamente, como redirecionar a saída de um fundo trabalho.
Steven Monday
Sim, desculpe, interpretou mal a questão e corrigiu isso agora
neocrow
Legal! Downvote retraído.
Steven Monday