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:
-
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.
-
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.
-
exec 1>log.out 2>&1
Redirigir
stdout
para presentarlog.out
luego redirigirstderr
astdout
. Tenga en cuenta que el orden es importante cuando desea que vayan al mismo archivo.stdout
debe ser redirigido antes destderr
se redirige astdout
.
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.