GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo registrar completamente todas las acciones de los scripts de bash?

Solución 1:

Generalmente coloco algo similar a lo siguiente al comienzo de cada script (especialmente si se ejecutará como un demonio):

#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':

Explicación:

  1. exec 3>&1 4>&2

    Guarda los descriptores de archivos para que puedan restaurarse a lo que eran antes de la redirección o usarse para generar lo que eran antes de la siguiente redirección.

  2. trap 'exec 2>&4 1>&3' 0 1 2 3

    Restaurar descriptores de archivos para señales particulares. Por lo general, no es necesario, ya que deben restaurarse cuando finaliza la subcapa.

  3. exec 1>log.out 2>&1

    Redirigir stdout para presentar log.out luego redirigir stderr a stdout . Tenga en cuenta que el orden es importante cuando desea que vayan al mismo archivo. stdout debe ser redirigido antes de stderr se redirige a stdout .

A partir de ese momento, para ver el resultado en la consola (tal vez), simplemente puede redirigir a &3 . Por ejemplo,

echo "$(date) : part 1 - start" >&3

irá a donde sea stdout fue dirigido, presumiblemente a la consola, antes de ejecutar la línea 3 anterior.

Solución 2:

para obtener la salida ssh a su archivo de registro, debe redirigir stderr a stdout . puedes hacer esto agregando 2>&1 después de su secuencia de comandos bash.

debería verse así:

#!/bin/bash
(
...
) 2>&1 | tee ...

cuando esto no muestre los mensajes en el orden correcto, intente agregar otra subcapa:

#!/bin/bash
((
...
) 2>&1) | tee ...

Solución 3:

Mientras leo su pregunta, no desea registrar la salida, sino la secuencia completa de comandos, en cuyo caso, las otras respuestas no lo ayudarán.

Invoque scripts de shell con -x para mostrar todo:

sh -x foo.sh

Inicie sesión en el archivo que desee con:

sh -x foo.sh >> /home/scripts/cron/logs

Solución 4:

En bash, puedes poner set -x e imprimirá cada comando que ejecute (y las variables bash) después de eso. Puedes apagarlo con set +x .

Si quieres ser paranoico, puedes poner set -o errexit en tu guión. Esto significa que la secuencia de comandos fallará y se detendrá si un comando devuelve un código de salida distinto de cero, que es la forma estándar de Unix de indicar que algo salió mal.

Si desea obtener mejores registros, debe consultar ts en el moreutils paquete debian/ubuntu. Prefijará cada línea con una marca de tiempo y la imprimirá. Para que pueda ver cuándo sucedieron las cosas.

Solución 5:

Siguiendo lo que otros dijeron, el manual establecido es un buen recurso. pongo:

#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x

En la parte superior de las secuencias de comandos deseo continuar, o set -ex si debe salir por error.


Linux
  1. ¿Cómo resaltar los scripts de Bash en Vim?

  2. ¿Cómo puedo eliminar el puerto TCP 16969 en Bash?

  3. ¿Cómo puedo probar mi script Bash en versiones anteriores de Bash?

  4. Ejecute todos los scripts de shell en la carpeta

  5. ¿Cómo puedo encontrar todos los archivos vinculados en un sistema de archivos?

Cómo ejecutar todos los scripts en un directorio en Linux

Cómo analizar archivos CSV en Bash Scripts en Linux

Cómo crear documentos con scripts Bash

Cómo usar el comando echo en Bash Scripts en Linux

Cómo trabajar con declaraciones de casos en scripts Bash

¿Cómo puedo registrar todos los inicios de procesos en Linux?