¿Redirigir STDERR / STDOUT de un proceso DESPUÉS de que se haya iniciado, usando la línea de comando?

En el intérprete de comandos, puede hacer la redirección, > < , etc., pero ¿qué ocurre DESPUÉS de iniciar un progtwig?

Así es como vine a hacer esta pregunta, un progtwig que se ejecuta en el fondo de mi terminal sigue emitiendo texto molesto. Es un proceso importante, así que tengo que abrir otro caparazón para evitar el texto. Me gustaría poder >/dev/null o alguna otra redirección para poder seguir trabajando en el mismo shell.

Además de cerrar y volver a abrir su tty (es decir, cerrar sesión y volver a encenderla, lo que también puede terminar algunos de sus procesos en segundo plano en el proceso), solo le queda una opción:

  • adjunte al proceso en cuestión usando gdb, y ejecute:
    • p dup2 (abierto (“/ dev / null”, 0), 1)
    • p dup2 (abierto (“/ dev / null”, 0), 2)
    • despegar
    • dejar

p.ej:

 $ tail -f /var/log/lastlog & [1] 5636 $ ls -l /proc/5636/fd total 0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/pts/0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/pts/0 lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog $ gdb -p 5636 GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later  This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Attaching to process 5636 Reading symbols from /usr/bin/tail...(no debugging symbols found)...done. Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done. Loaded symbols for /lib/librt.so.1 Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done. [Thread debugging using libthread_db enabled] [New Thread 0x7f3c8f5a66e0 (LWP 5636)] Loaded symbols for /lib/libpthread.so.0 Reading symbols from /lib/ld-linux-x86-64.so.2...(no debugging symbols found)...done. Loaded symbols for /lib64/ld-linux-x86-64.so.2 (no debugging symbols found) 0x00007f3c8eec7b50 in nanosleep () from /lib/libc.so.6 (gdb) p dup2(open("/dev/null",0),1) [Switching to Thread 0x7f3c8f5a66e0 (LWP 5636)] $1 = 1 (gdb) p dup2(open("/dev/null",0),2) $2 = 2 (gdb) detach Detaching from program: /usr/bin/tail, process 5636 (gdb) quit $ ls -l /proc/5636/fd total 0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/null lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/null lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog lr-x------ 1 myuser myuser 64 Feb 27 07:36 4 -> /dev/null lr-x------ 1 myuser myuser 64 Feb 27 07:36 5 -> /dev/null 

También puede considerar:

  • usando la screen ; La pantalla proporciona varios TTY virtuales a los que puede cambiar sin tener que abrir nuevas sesiones de SSH / telnet / etc.
  • usando nohup ; esto le permite cerrar y volver a abrir su sesión sin perder ningún proceso en segundo plano en el … proceso.

Esto lo hara:

 strace -ewrite -p $PID 

No es tan limpio (muestra líneas como: write(#,) ), ¡pero funciona!


También podría desagradar el hecho de que los argumentos se abrevian. Para controlarlo, use el parámetro -s que establece la longitud máxima de las cadenas que se muestran.

Captura todas las transmisiones, por lo que es posible que desee filtrarlas de alguna manera:

 strace -ewrite -p $PID 2>&1 | grep "write(1" 

muestra solo las llamadas del descriptor 1. 2>&1 es para redirigir STDERR a STDOUT, ya que strace escribe en STDERR de manera predeterminada.

riffing de la excelente investigación de vladr (y de otros):

crea los siguientes dos archivos en el mismo directorio, algo en tu camino, digamos $ HOME / bin:

silence.gdb, que contiene (de la respuesta de vladr):

 p dup2(open("/dev/null",0),1) p dup2(open("/dev/null",0),2) detach quit 

y silencio, que contiene:

 #!/bin/sh if [ "$0" -a "$1" ]; then gdb -p $1 -x $0.gdb else echo Must specify PID of process to silence >&2 fi 
 chmod +x ~/bin/silence # make the script executable 

Ahora, la próxima vez que olvide redirigir Firefox, por ejemplo, y su terminal empiece a saturarse con el inevitable mensaje “(firefox-bin: 5117): Gdk-WARNING **: colisión XID, problemas futuros”:

 ps # look for process xulrunner-stub (in this case we saw the PID in the error above) silence 5117 # run the script, using PID we found 

También puede redirigir la salida de gdb a / dev / null si no desea verla.

Redirigir el resultado de un proceso en ejecución a otro terminal, archivo o pantalla:

 tty ls -l /proc/20818/fd gdb -p 20818 

Dentro de gdb :

 p close(1) p open("/dev/pts/4", 1) p close(2) p open("/tmp/myerrlog", 1) q 

Separe un proceso en ejecución del terminal de bash y manténgalo vivo:

 [Ctrl+z] bg %1 && disown %1 [Ctrl+d] 

Explicación:

20818: solo un ejemplo del proceso de ejecución pid
p – imprime el resultado del comando gdb
cerrar (1) – cierre de salida estándar
/ dev / pts / 4 – terminal para escribir en
cerrar (2) – cerrar salida de error
/ tmp / myerrlog – archivo para escribir
q – salga de gdb
bg% 1 – ejecuta el trabajo 1 suspendido en el fondo
renunciar% 1 – separar el trabajo 1 de la terminal

No es una respuesta directa a su pregunta, pero es una técnica que he estado encontrando útil en los últimos días: ejecute el comando inicial usando ‘pantalla’, y luego separe.

Esta es la parte del script bash basada en respuestas anteriores, que redirige el archivo de registro durante la ejecución de un proceso abierto, se usa como postdata en el proceso logrotate

 #!/bin/bash pid=$(cat /var/run/app/app.pid) logFile="/var/log/app.log" reloadLog() { getStatus if [ "$pid" = "" ]; then showStatus else gdb -p $pid >/dev/null 2>&1 <  " | awk '{print $11}') echo "log file set to $LOG_FILE" fi } reloadLog 

Dupx es una sencilla herramienta * nix para redirigir la salida / entrada / error estándar de un proceso ya en ejecución.

https://www.isi.edu/~yuri/dupx/