GNU/Linux >> Tutoriales Linux >  >> Linux

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

Aparte de cerrar y volver a abrir su tty (es decir, cerrar sesión y volver a iniciarla, lo que también puede finalizar 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(abrir("/dev/null", 0), 1)
    • p dup2(abrir("/dev/null", 0), 2)
    • separar
    • salir

por ejemplo:

$ 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 screen; La pantalla proporciona varios TTY virtuales entre los que puede alternar sin tener que abrir nuevas sesiones 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 hará:

strace -ewrite -p $PID

No es tan limpio (muestra líneas como:write(#,<text you want to see>) ), ¡pero funciona!

También puede que no le guste el hecho de que los argumentos estén abreviados. Para controlar eso usa el -s parámetro que establece la longitud máxima de las cadenas mostradas.

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

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

muestra solo las llamadas del descriptor 1. 2>&1 es redirigir STDERR a STDOUT, como strace escribe en STDERR por defecto.


refiriéndose a la excelente investigación de vladr (y otros):

cree los siguientes dos archivos en el mismo directorio, algo en su ruta, diga $HOME/bin:

silent.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 se olvide de redirigir Firefox, por ejemplo, y su terminal comience a abarrotarse con los inevitables mensajes "(firefox-bin:5117):Gdk-WARNING **:colisión XID, problemas por delante":


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 verlo.


Linux
  1. Una introducción al uso de tcpdump en la línea de comandos de Linux

  2. Usando la fuerza en la línea de comando de Linux

  3. Cómo apagar o reiniciar Linux usando la línea de comandos

  4. ¿Redirigir Stderr de todos los comandos subsiguientes usando Exec?

  5. ¿Echo Text After Curl Command en la misma línea?

Cómo crear un archivo en Linux usando Terminal/Línea de comando

Cómo redirigir stderr a stdout en Bash

Conozca su Sistema (usando la línea de comando)

Cómo crear una base de datos en MySQL usando la línea de comandos

Cómo probar la velocidad de Internet usando la línea de comandos en Linux

Establecer el tiempo relativo usando la línea de comando