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.
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:
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
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.
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).
Tags bash linux io-redirection