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>&2Guarda 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 3Restaurar 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>&1Redirigir
stdoutpara presentarlog.outluego redirigirstderrastdout. Tenga en cuenta que el orden es importante cuando desea que vayan al mismo archivo.stdoutdebe ser redirigido antes destderrse 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.