Linux (Bash): Redirigir toda la salida al archivo [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de redirigir toda la salida de un programa de línea de comandos a un archivo. Estoy usando Bash. Parte de la salida se dirige a un archivo, pero parte todavía aparece en el terminal y no se almacena en el archivo.

Síntomas similares se describen aquí:

Redirigir toda la salida a file

Sin embargo, he intentado la solución propuesta (capture stderr) sin éxito:

<cmd> <args> > stdout.txt 2> stderr.txt

El archivo stderr.txt se crea pero está vacío.

Una posible pista es que el programa de línea de comandos es un cliente que se comunica con un servidor en la misma máquina. Puede ser que parte de la salida provenga del servidor .

Hay una manera de capturar todos los salida de la terminal, independientemente de su origen?

EDITAR:

He confirmado que la salida que falta es generada por el servidor. Ejecutar el comando en un terminal separado causa alguna salida en ambos terminales, puedo canalizar toda la salida desde el terminal de comandos a un archivo. Esto plantea problemas sobre cómo capturar la salida del servidor, pero esa es una pregunta diferente.

Author: Community, 2013-05-30

6 answers

Si el servidor se inicia en el mismo terminal, entonces es el stderr del servidor que presumiblemente se escribe en el terminal y que no está capturando.

La mejor manera de capturar todo sería ejecutar:

script output.txt

Antes de iniciar el servidor o el cliente. Esto lanzará un nuevo shell con toda la salida de terminal redirigida a la salida.txt, así como la terminal. A continuación, inicie el servidor desde ese nuevo shell y, a continuación, el cliente. Todo lo que ves en la pantalla (tanto su entrada como la salida de todo lo que escribe en el terminal desde ese shell) se escribirán en el archivo.

Cuando haya terminado, escriba "exit" para salir del shell ejecutado por el comando script.

 50
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-30 17:20:46

Puede usar esta sintaxis para redirigir todas las salidas stderr y stdout a stdout.txt

<cmd> <args> > allout.txt 2>&1 
 84
Author: developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 14:25:50

Aunque no POSIX, bash 4 tiene el operador &>:

command &> alloutput.txt

 31
Author: Patrick Pijnappel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-23 07:10:58

Puede ejecutar un subshell y redirigir toda la salida mientras sigue poniendo el proceso en segundo plano:

( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid
 3
Author: chovy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 17:39:32

La respuesta correcta está aquí: http://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html

your_command | ssh username@server "cat > filename.txt"
 2
Author: Morlock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-01 14:56:13

Tuve problemas con un programa que se estrellaba *tos PHP tos* Al estrellarse el shell se ejecutó en los informes de la razón del accidente, Segmentation fault (core dumped)

Para evitar que esta salida no se registre, el comando se puede ejecutar en una subcapa que capturará y dirigirá este tipo de salida:

sh -c 'your_command' > your_stdout.log 2> your_stderr.err
# or
sh -c 'your_command' > your_stdout.log 2>&1
 2
Author: ThorSummoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:19