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

11

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>&1ou > /tmp/mystdout) e meu processo em segundo plano já esteja em execução por um tempo, ainda posso mudar para onde stdoute para onde estou stderrsendo 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 stderrparastdout

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
gertvdijk
fonte
Mudar para outro terminal? Ou para um arquivo? Se você se contentar em se conectar ao terminal atual ou a uma nova sessão de tela, consulte Como posso negar um processo em execução e associá-lo a um novo shell de tela?
Gilles 'SO- stop be evil'

Respostas:

8

Você pode fazer isso usando o reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

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

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

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

O reredirect READMEtambém explica como redirecionar para outro comando ou redirecionar apenas stdout ou stderr.

Jérôme Pouiller
fonte
3

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.

Dennis Kaarsemaker
fonte
1
Existem ferramentas para isso hoje em dia .
Gilles 'SO- stop be evil'
Sinta-se livre para compartilhá-los, eu vou upvote a resposta :)
Dennis Kaarsemaker
Hum, eu já fiz .
Gilles 'SO- stop be evil'
1
Nem tanto. Todas as ferramentas vinculadas no outro bug são sobre anexar a outra sessão de terminal / tela. Não se trata de redirecionar para outro arquivo. Embora provavelmente não seja difícil corrigir o reptyr para redirecionar para um arquivo.
Dennis Kaarsemaker
Analisei um pouco a fonte do reptyr e concordo mais com a parte "não fácil" da resposta. Pode dar um mergulho mais profundo nela algum tempo depois.
precisa saber é o seguinte
2

Você deve usar o reptyr para anexar outro processo ao seu novo terminal atual. Por exemplo: instale e use o screenutilitário GNU e nele inicie o reptyrcomando para "buscar" os redirecionamentos do outro processo (e terminal de controle) e anexá-los ao novo terminal atual (o screenprocesso, se você iniciou a reptyrpartir screen). A vantagem de fazer isso em uma screensessão é que, uma vez abaixo screen, será fácil desconectá-lo e reconectá-lo (por exemplo, fechar sua sessão local, voltar para casa e reabri-la).

Olivier Dulac
fonte
Obrigado pela sua resposta, mas isso não me ajuda com o meu caso, pois não estou perguntando sobre a desconexão / reconexão do terminal. Por favor, releia minha pergunta e o exemplo em específico.
Gdvdijk
ah, nesse caso: leia o código reptyr, descubra como modificá-lo para redirecionar apenas stdout ou stderr. Em seguida, execute-o em outro shell que redireciona esse fluxo recém-anexado para onde você deseja que ele vá? (ou, melhor, usando a fonte reptyr, faça o redirecionamento diretamente)
Olivier Dulac