Eu sei como redirecionar a saída e como suprimi-los no bash. Agora, suponha que eu esqueci acidentalmente de anexar a parte de redirecionamento de saída ao comando (por exemplo, 2>&1
ou > /tmp/mystdout
) e meu processo em segundo plano já esteja em execução por um tempo, ainda posso mudar para onde stdout
e para onde estou stderr
sendo gravado? Eu realmente gostaria de não matar e reiniciar o aplicativo.
Para ser mais específico, conforme solicitado por Gilles em seu comentário, eu gostaria de mexer com isso nesses cenários em específico:
- arquivo de saída errado
- esqueceu de redirecionar
stderr
parastdout
ou uma combinação de ambos
Por exemplo, eu tenho o Apache em execução e posso ver os descritores de arquivo:
/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
linux
bash
io-redirection
gertvdijk
fonte
fonte
Respostas:
Você pode fazer isso usando o reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Você pode restaurar a saída inicial do seu processo posteriormente usando algo como:
(
<M>
e<N>
são fornecidas pelo lançamento anterior do reredirect).O reredirect
README
também explica como redirecionar para outro comando ou redirecionar apenas stdout ou stderr.fonte
Isso não é possível. Ou pelo menos não é fácil. Você pode ter alguma sorte anexando o gdb ao processo e mexendo com ele no gdb, mas isso pode levar a falhas tão facilmente quanto o sucesso.
fonte
Você deve usar o reptyr para anexar outro processo ao seu novo terminal atual. Por exemplo: instale e use o
screen
utilitário GNU e nele inicie oreptyr
comando para "buscar" os redirecionamentos do outro processo (e terminal de controle) e anexá-los ao novo terminal atual (oscreen
processo, se você iniciou areptyr
partirscreen
). A vantagem de fazer isso em umascreen
sessão é que, uma vez abaixoscreen
, será fácil desconectá-lo e reconectá-lo (por exemplo, fechar sua sessão local, voltar para casa e reabri-la).fonte