Como alterar o redirecionamento de saída de um processo em execução?

7

Eu sei como redirecionar a saída e como suprimi-los no bash. Agora, suponha que eu acidentalmente tenha esquecido de anexar a parte de redirecionamento de saída ao comando (por exemplo, 2>&1 ou > /tmp/mystdout ) e meu processo de segundo plano já está em execução há algum tempo, ainda posso mudar para onde stdout e stderr sendo escrito para? Eu realmente gostaria de não matar e reiniciar o aplicativo.

Para ser mais específico, como perguntado por Gilles em seu comentário, eu gostaria de mexer com isso nesses cenários em específico:

  • arquivo de saída incorreto
  • esqueceu-se de redirecionar stderr para stdout

ou uma combinação de ambos

Por exemplo Eu tenho o Apache em execução e posso ver os descritores de arquivos:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
    
por gertvdijk 22.12.2012 / 00:41

3 respostas

3

Isso não é possível. Ou pelo menos não é fácil. Você pode ter alguma sorte ao anexar o gdb ao processo e mexer nele no gdb, mas isso pode levar a falhas com a mesma facilidade do sucesso.

    
por 22.12.2012 / 00:45
6

Você pode fazer isso usando o rirectirect ( link ).

reredirect -m /dev/null <PID>

Você pode restaurar a saída inicial de seu processo posteriormente usando algo como:

reredirect -N -O <M> -E <N> <PID>

( <M> e <N> são fornecidos pelo lançamento anterior do reredirect).

reredirect README também explica como redirecionar para outro comando ou redirecionar somente stdout ou stderr.

    
por 14.10.2014 / 16:22
2

Você deve usar o reptyr para anexar outro processo ao seu novo terminal atual. Por exemplo: instale e use o utilitário screen do GNU e inicie o comando reptyr para "buscar" os redirecionamentos do outro processo (e o terminal de controle) e anexe-os ao novo terminal atual (o processo screen , se você lançou reptyr de screen ). A vantagem de fazer isso de uma sessão screen é que, uma vez abaixo de screen , será fácil desconectar e reconectar (por exemplo, fechando sua sessão local, indo para casa e reabtecendo-a).

    
por 26.12.2012 / 14:43