salida redireccionar redireccionamiento por mensajes los guardar generados filtros estandar error envían entrada ejemplos dónde defecto comandos comando archivo linux bash shell

linux - redireccionamiento - redireccionar entrada estandar c



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

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/

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

Así es como vine a hacer esta pregunta, un programa 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 <http://gnu.org/licenses/gpl.html> 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.

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 <<LOADLOG p close(1) p open("$logFile", 1) p close(2) p open("$logFile", 1) q LOADLOG LOG_FILE=$(ls /proc/${pid}/fd -l | fgrep " 1 -> " | awk ''{print $11}'') echo "log file set to $LOG_FILE" fi } reloadLog


Esto lo hara:

strace -ewrite -p $PID

No es tan limpio (muestra líneas como: write(#,<text you want to see>) ), ¡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.


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.


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


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.