En el shell puede hacer redirección, >
<
etc., pero ¿qué tal DESPUÉS de que se inicie un programa?
Así es como llegué a hacer esta pregunta, un programa que se ejecuta en el fondo de mi terminal sigue generando texto molesto. Es un proceso importante, así que tengo que abrir otro shell para evitar el texto. Me gustaría poder >/dev/null
o alguna otra redirección para poder seguir trabajando en el mismo shell.
Respuestas:
Antes de cerrar y volver a abrir su tty (es decir, cerrar sesión y volver a iniciarla, lo que también puede terminar algunos de sus procesos en segundo plano en el proceso) solo le queda una opción:
p.ej:
También puede considerar:
screen
; La pantalla proporciona varios TTY virtuales entre los que puede cambiar sin tener que abrir nuevas sesiones SSH / telnet / etc.nohup
; Esto le permite cerrar y volver a abrir su sesión sin perder ningún proceso en segundo plano en el ... proceso.fuente
open("/path/to/new/stdout",O_WRONLY)
. Sin embargo, O_WRONLY probablemente no estará disponible; su valor está1
en Linux / glibc.1025
activaO_APPEND
además deO_WRONLY
, lo cual es útil si redirige stderr y stdout al mismo archivo.Esto lo hara:
No es tan limpio (muestra líneas como:)
write(#,<text you want to see>)
, ¡pero funciona!También es posible que no le guste el hecho de que los argumentos se abrevian. Para controlar eso, use el
-s
parámetro que establece la longitud máxima de las cadenas que se muestran.Captura todas las transmisiones, por lo que es posible que desee filtrar eso de alguna manera:
muestra solo descriptor 1 llamadas.
2>&1
es redirigir STDERR a STDOUT, como sestrace
escribe en STDERR de forma predeterminada.fuente
sudo
sea necesario.analizando la excelente investigación de vladr (y de otros):
cree los siguientes dos archivos en el mismo directorio, algo en su ruta, diga $ HOME / bin:
silencio.gdb, que contiene (de la respuesta de vladr):
y silencio, que contiene:
Ahora, la próxima vez que se olvide de redirigir Firefox, por ejemplo, y su terminal comienza a saturarse con los inevitables mensajes "(firefox-bin: 5117): Gdk-WARNING **: colisión XID, problemas por delante":
También puede redirigir la salida de gdb a / dev / null si no desea verla.
fuente
--batch-silent
que suprime la salida y no lo descarga en la consola de gdb si algo sale mal (por ejemplo, falta un proceso). Por cierto, se$!
refiere al trabajo de fondo más reciente, pero no creo que pueda usarse en el script en sí. Yo uso un alias:alias silencebg='silence $!'
Redirigir la salida de un proceso en ejecución a otro terminal, archivo o pantalla:
Dentro de gdb :
Separe un proceso en ejecución del terminal bash y manténgalo vivo:
Explicación:
20818 - solo un ejemplo de proceso en ejecución pid
p - imprimir resultado del comando gdb
close (1) - cerrar salida estándar
/ dev / pts / 4 - terminal para escribir para
cerrar (2) - cerrar salida de error
/ tmp / myerrlog - archivo para escriba en
q - salga de gdb
bg% 1 - ejecute el trabajo detenido 1 en segundo plano
% 1 - desconecte el trabajo 1 del terminal
fuente
stdin
(descriptor de archivo0
) está cerrado.p open("/tmp/myerrlog", 2)
?No es una respuesta directa a su pregunta, pero es una técnica que he encontrado útil en los últimos días: ejecute el comando inicial usando 'pantalla' y luego desconecte.
fuente
Esta es una parte del script bash basada en respuestas anteriores, que redirige el archivo de registro durante la ejecución de un proceso abierto, se utiliza como postdata en
logrotate
procesofuente
https://www.isi.edu/~yuri/dupx/
fuente
Puede usar reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Tipo
y las salidas (estándar y error) se escribirán en ARCHIVO.
reredirect README también explica cómo restaurar el estado original del proceso, cómo redirigir a otro comando o redirigir solo stdout o stderr.
reredirect
También proporciona un script llamadorelink
que permite redirigir al terminal actual:(reredirect parece tener las mismas características que Dupx descrito en otra respuesta, pero no depende de Gdb).
fuente