¿Cómo cambiar la redirección de salida de un proceso en ejecución?

11

Sé cómo redirigir la salida y cómo suprimirlos en bash. Ahora, supongamos que accidentalmente olvidé agregar la parte de redirección de salida al comando (por ejemplo, 2>&1o > /tmp/mystdout) y mi proceso en segundo plano ya se está ejecutando por un tiempo, ¿puedo cambiar a dónde stdouty en qué stderrse está escribiendo? Realmente me gustaría no matar y reiniciar la aplicación.

Para ser más específico como lo pidió Gilles en su comentario, me gustaría jugar con esto en estos escenarios en específico:

  • archivo de salida incorrecto
  • olvidé redirigir stderrastdout

O una combinación de ambos

Por ejemplo, tengo Apache ejecutándose y puedo ver los descriptores de archivo:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
gertvdijk
fuente
¿Cambiar a otra terminal? O a un archivo? Si está contento con conectarse al terminal actual o a una nueva sesión de pantalla, consulte ¿Cómo puedo rechazar un proceso en ejecución y asociarlo a un nuevo shell de pantalla?
Gilles 'SO- deja de ser malvado'

Respuestas:

8

Puede hacerlo utilizando reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Puede restaurar la salida inicial de su proceso más tarde usando algo como:

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

( <M>y <N>son proporcionados por el lanzamiento anterior de reredirect).

reredirect READMEtambién explica cómo redirigir a otro comando o redirigir solo stdout o stderr.

Jérôme Pouiller
fuente
3

Eso no es posible. O al menos no es fácil. Es posible que tenga un poco de suerte adjuntando gdb al proceso y jugando con él en gdb, pero eso puede provocar bloqueos tan fácilmente como el éxito.

Dennis Kaarsemaker
fuente
1
Hay herramientas para esto hoy en día .
Gilles 'SO- deja de ser malvado'
Siéntase libre de compartirlos, votaré la respuesta :)
Dennis Kaarsemaker
Um, ya lo hice .
Gilles 'SO- deja de ser malvado'
1
No exactamente. Todas las herramientas vinculadas en el otro error tratan de conectarse a otra sesión de terminal / pantalla. No se trata de redirigir a otro archivo. Aunque probablemente no sea difícil parchear reptyr para redirigir a un archivo.
Dennis Kaarsemaker
He examinado un poco la fuente de reptyr y estoy más de acuerdo con la parte "no fácil" de la respuesta. Podría profundizar un poco más tarde.
gertvdijk
2

Debe usar reptyr para adjuntar otro proceso a su nueva terminal actual. Por ejemplo: instale y use la screenutilidad de GNU , y en él inicie el reptyrcomando para "buscar" las redirecciones del otro proceso (y el terminal de control) y adjúntelas al nuevo terminal actual (el screenproceso, si lo inició reptyrdesde screen). La ventaja de hacer esto desde una screensesión es que, una vez debajo screen, será fácil desconectarse y volver a conectarse (por ejemplo, cerrar la sesión local, volver a casa y volver a abrirla).

Olivier Dulac
fuente
Gracias por su respuesta, pero no me ayuda con mi caso, ya que no estoy preguntando acerca de la desconexión / desconexión de terminales. Vuelva a leer mi pregunta y el ejemplo en específico.
gertvdijk
Ah, en ese caso: lea el código reptyr, descubra cómo modificarlo para redirigir stdout o stderr. Luego, ¿ejecutarlo desde otro shell que redirige esa secuencia recién conectada a donde desea que vaya? (o, mejor, usando la fuente reptyr, haga la redirección directamente)
Olivier Dulac