2010-03-24 16 views
5

tengo una aplicación que se ejecuta el comando de la siguiente manera:Cómo redirigir la salida lejos de/dev/null

<command> <switches> >& /dev/null

puedo configurar <command>, pero no tengo ningún control sobre <switches>. Toda la salida generada por este comando va al /dev/null. Quiero que la salida sea visible en la pantalla o redirigida a un archivo de registro.

He intentado utilizar freopen() y funciones relacionadas para volver a abrir /dev/null en otro archivo, pero no he podido ponerlo en funcionamiento.

¿Tiene alguna otra idea? ¿Es esto posible?

Gracias por su tiempo.

PD: Estoy trabajando en Linux.

+0

¿Qué tiene esto que ver con Perl? –

+0

A menos que pueda cambiar el comando en el script, creo que no tiene suerte. Una vez redirigido a nulo, no puede recuperarlo porque todos los descriptores de archivos que puede compartir con él (stdin, stdout, stderr) han desaparecido. – tvanfosson

+0

¿Así que usted tiene control sobre el comando, pero no la redirección del mismo? Si es así, diría que e-t172 lo tiene correcto, o al menos tan bien como lo va a obtener: http://stackoverflow.com/questions/2507569/how-to-redirect-output-away-from -dev-null/2507624 # 2507624 De lo contrario, actualice para aclarar. –

Respuesta

4

Como puede modificar el comando que ejecuta, puede usar un script de shell simple como contenedor para redirigir el resultado a un archivo.

#!/bin/bash 
"[email protected]" >> logfile 

Si guarda esto en su trayectoria como capture_output.sh continuación, puede añadir capture_output.sh al inicio de su comando para anexar la salida de su programa de archivo de registro.

7

Terrible Hack:

usar un editor de texto en modo binario abrir la aplicación, encontrar '/ dev/null /' y sustituirla por una cadena de la misma longitud

e.g '~/tmp/log' 
  • maquillaje una copia de seguridad primero
  • ten cuidado
  • ser muy cuidadoso
  • No he mencionado la copia de seguridad?
+0

Aclaración: abra el ejecutable binario con el editor de texto. En algún lugar del galimatías de las cosas binarias debería haber "/ dev/null" que es lo que reemplaza como sugerido anteriormente – Ricket

+0

@lexu: Lo había hecho antes. Reemplacé/dev/null con una cadena de espacios de igual longitud. Esto funciona, pero para cada versión de la aplicación, hackear el ejecutable es tedioso ... Estaba pensando en escribir un programa que hace un truco de redirección y llama al . Este será un esfuerzo de una vez. – Gowtham

+1

+1 para la lista de acompañamiento. –

2

Agregue # al final de su comando por lo que se convierte en <command> # >& /dev/null, comentando así la parte no deseada.

+0

@ e-t172: Buena idea. Olvidé mencionar el . El comando se llama como '> &/dev/null' – Gowtham

1

¿Puede crear un alias para ese comando? Si es así, alias a otro comando que vuelca la salida a un archivo.

0

EDITAR: Esta NO es una buena idea y, desde luego, no vale la pena intentarla a menos que sepa lo que puede romperse. Funciona para mí, puede funcionar para usted también.

Ok, este es un truco muy malo y probablemente no vale la pena hacerlo. Suponiendo que ninguno de los otros comandos funciona, y simplemente no tiene acceso al binario/aplicación (que contiene el comando con /dev/null) y no puede redirigir el resultado a otro archivo (reemplazando /dev/null).

Luego, puede eliminar/dev/null ($> rm /dev/null) y crear su propio archivo en su lugar (preferiblemente con un enlace suave) donde se pueden dirigir todos los datos. Cuando haya terminado, puede crear el directorio/dev/null, una vez más usando los siguientes comandos:

$> mknod -m 666 /dev/null c 1 3

sólo para estar muy claro, esto es una mala corte y ciertamente requiere raíz permisos para el trabajo . Posibilidades de que su archivo redirigido pueda contener datos de muchas otras aplicaciones/binarios que se están ejecutando y use /dev/null como receptor.

+0

Solo para agregar, probé esto en mi máquina, que es una Fedora que ejecuta 2.6.30. Esta información es así porque el número mayor y menor puede ser diferente para mknod en otras plataformas/entorno. – Shrey

+0

Sería genial si se explicara 'por qué-mi-respuesta-fue-rechazada' como comentario. Sé que esto es un truco (se menciona claramente en silencio) y esto es explícitamente lo que el afiche estaba buscando "... pero no tengo control sobre ...". – Shrey

+0

Eliminar/dev/null va más allá de ser un truco. Es una idea completamente rota. Afecta al sistema completo (cualquier nueva apertura en el nombre de ruta), no solo al script/programa específico. Tiene que ser "arreglado" después de que haya terminado. Y requiere acceso de root.La respuesta aquí no es "redirigir/dev/null", sino volver a abrir los descriptores existentes que se abrieron originalmente desde/dev/null. –

1

El archivo de dispositivo /dev/tty hace referencia a la terminal de control de la aplicación - si eso no ha cambiado, entonces esto debería funcionar:

freopen("/dev/tty", "w", stdout); 
freopen("/dev/tty", "w", stderr); 

Como alternativa, puede volver a abrir para que apunten a un archivo de registro:

freopen("/var/log/myapp.log", "a", stdout); 
freopen("/var/log/myapp.err", "a", stderr); 
2

Su aplicación probablemente está ejecutando un shell y pasándole esa línea de comando.

Debe ejecutar un script escrito por usted. Ese script reemplazará >/dev/null en la línea de comando con >>/your/log y llamará al shell real con la línea de comando modificada.

El primer paso es cambiar el shell utilizado por la aplicación. Cambio de la variable de entorno SHELL debería ser suficiente, es decir, ejecutar la aplicación como

SHELL=/home/user/bin/myshell theApp 

Si eso no funciona, intente vincular momentáneamente /bin/sh a su script.

myshell llamará a la shell original, pero después de patrones sustituyendo los parámetros:

#!/bin/bash 
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"} 

Algo a lo largo de estas líneas debería funcionar.

0

en Perl, si lo que desea redirigir STDOUT a algo un poco más útil, que sólo puede hacer algo como:

open STDOUT, '>>', '/var/log/myscript.log'; 
open STDERR, '>>', '/var/log/myscript.err'; 

al comienzo de su script, y que va a redirigirlo para el resto de tu script

0

A lo largo de las líneas de respuesta de e-T172, ¿Se puede configurar el último cambio a (o anexar a ella):

; echo 
1

Puede que no redirigir exactamente, pero permite obtener la salida donde se está enviado

strace -ewrite -p $PID

no es que cleen (muestra líneas como: escribir (#,)), pero funciona! (y es de una sola línea: D) También puede desagradar el hecho de que los argumentos se abrevian. Para controlar el parámetro -s de uso 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.

Puedes realizar un filtrado que:

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

muestra solamente descriptor 1 llama. 2> & 1 es para redirigir stderr a stdout, ya que strace escribe en stderr de forma predeterminada.

0

Si puede poner algo en línea antes de pasar cosas a/dev/null (no estoy seguro si se trata de un comando codificado), puede usar tee para redirigir a algo de su elección.

Ejemplo de Wikipedia que permite la escalada de un comando:

echo "Body of file..." | sudo tee root_owned_file > /dev/null 

http://en.wikipedia.org/wiki/Tee_(command)

Cuestiones relacionadas