Quiero capturar TODOS los datos de los registros, ambos con mensajes de error, de la salida de mi script, y redirigirlos a todos al archivo de registro.
Tengo script como a continuación:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
Quiero ver todas las acciones en el archivo /home/scripts/cron/logs
Pero solo veo esto lo que puse después del comando echo.
¿Cómo verificar los registros si el comando SSH fue exitoso?
Necesito reunir todos los datos de los registros. Necesito esto para monitorear el resultado de cada comando en mi script, para analizar mejor lo que sucede mientras el script falla.
Respuestas:
Generalmente pongo algo similar al siguiente al comienzo de cada script (especialmente si se ejecutará como un demonio):
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. En general, no es necesario ya que deben restaurarse cuando sale el subconcha.
exec 1>log.out 2>&1
Redireccionar
stdout
a archivo ylog.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
ser redirigido astdout
.A partir de entonces, para ver la salida de la consola (tal vez), puede simplemente redirigir a
&3
. Por ejemplo,irá a donde
stdout
fue dirigido, presumiblemente la consola, antes de ejecutar la línea 3 anterior.fuente
trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN
. RETURN pseudo sigspec restaura los descriptores de archivos cada vez que se ejecuta una función de shell o un script con. o la fuente integrada termina de ejecutarse. Por esto (y por otras razones) en mis scripts agrego como las últimas 2 líneas:return
&exit 0
- ¡Solo mis 2 centavos, felicitaciones a usted @nicerobot!trap
señales parece un poco extraña. Por lo general, también querrás incluirlo15
.para obtener la salida ssh en su archivo de registro, debe redirigir
stderr
astdout
. puede hacer esto agregando2>&1
después de su script bash.Debe tener un aspecto como este:
cuando esto no muestre los mensajes en el orden correcto, intente agregar otra subshell:
fuente
( ... ) |& tee output.log
Mientras leo su pregunta, no desea registrar la salida, pero la secuencia completa de comandos, en cuyo caso, las otras respuestas no lo ayudarán.
Invoque scripts de shell con -x para generar todo:
sh -x foo.sh
Inicie sesión en el archivo que desee con:
sh -x foo.sh >> /home/scripts/cron/logs
fuente
En bash, puede poner
set -x
e imprimirá cada comando que ejecuta (y las variables de bash) después de eso. Puedes apagarlo conset +x
.Si quieres ser paranoico, puedes poner
set -o errexit
tu guión. Esto significa que el script fallará y se detendrá si un comando devuelve un código de salida distinto de cero, que es la forma estándar de Unix para indicar que algo salió mal.Si desea obtener mejores registros, debe mirar
ts
en elmoreutils
paquete debian / ubuntu. Prefijará cada línea con una marca de tiempo y la imprimirá. Para que pueda ver cuándo estaban sucediendo cosas.fuente
Después de lo que otros dijeron, el manual conjunto es un buen recurso. Puse:
En la parte superior de los scripts, deseo continuar, o
set -ex
si sale por error.fuente
ssh -vv
¿ tal vez ?