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>&1
o > /tmp/mystdout
) y mi proceso en segundo plano ya se está ejecutando por un tiempo, ¿puedo cambiar a dónde stdout
y en qué stderr
se 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
stderr
astdout
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
linux
bash
io-redirection
gertvdijk
fuente
fuente
Respuestas:
Puede hacerlo utilizando reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Puede restaurar la salida inicial de su proceso más tarde usando algo como:
(
<M>
y<N>
son proporcionados por el lanzamiento anterior de reredirect).reredirect
README
también explica cómo redirigir a otro comando o redirigir solo stdout o stderr.fuente
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.
fuente
Debe usar reptyr para adjuntar otro proceso a su nueva terminal actual. Por ejemplo: instale y use la
screen
utilidad de GNU , y en él inicie elreptyr
comando para "buscar" las redirecciones del otro proceso (y el terminal de control) y adjúntelas al nuevo terminal actual (elscreen
proceso, si lo inicióreptyr
desdescreen
). La ventaja de hacer esto desde unascreen
sesión es que, una vez debajoscreen
, será fácil desconectarse y volver a conectarse (por ejemplo, cerrar la sesión local, volver a casa y volver a abrirla).fuente