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