Soluzione 1:
In genere metto qualcosa di simile a quanto segue all'inizio di ogni script (specialmente se verrà eseguito come demone):
#!/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':
Spiegazione:
-
exec 3>&1 4>&2
Salva i descrittori di file in modo che possano essere ripristinati a ciò che erano prima del reindirizzamento o utilizzati per l'output a ciò che erano prima del reindirizzamento successivo.
-
trap 'exec 2>&4 1>&3' 0 1 2 3
Ripristina i descrittori di file per segnali particolari. Generalmente non sono necessarie in quanto dovrebbero essere ripristinate quando la sub-shell esce.
-
exec 1>log.out 2>&1
Reindirizza
stdout
al filelog.out
quindi reindirizzarestderr
astdout
. Nota che l'ordine è importante quando vuoi che vadano allo stesso file.stdout
deve essere reindirizzato prima distderr
viene reindirizzato astdout
.
Da quel momento in poi, per vedere l'output sulla console (forse), puoi semplicemente reindirizzare a &3
. Ad esempio,
echo "$(date) : part 1 - start" >&3
andrà ovunque stdout
è stato diretto, presumibilmente la console, prima dell'esecuzione della riga 3 di cui sopra.
Soluzione 2:
per ottenere l'output ssh nel tuo file di log, devi reindirizzare stderr
a stdout
. puoi farlo aggiungendo 2>&1
dopo il tuo script bash.
dovrebbe assomigliare a questo:
#!/bin/bash
(
...
) 2>&1 | tee ...
quando questo non mostra i messaggi nel giusto ordine, prova ad aggiungere un'altra subshell:
#!/bin/bash
((
...
) 2>&1) | tee ...
Soluzione 3:
Mentre leggo la tua domanda, non vuoi registrare l'output, ma l'intera sequenza di comandi, nel qual caso le altre risposte non ti aiuteranno.
Richiama gli script della shell con -x per generare tutto:
sh -x foo.sh
Accedere al file desiderato con:
sh -x foo.sh >> /home/scripts/cron/logs
Soluzione 4:
In bash, puoi inserire set -x
e successivamente stamperà ogni comando che esegue (e le variabili bash). Puoi disattivarlo con set +x
.
Se vuoi essere paranoico, puoi inserire set -o errexit
nella tua sceneggiatura. Ciò significa che lo script fallirà e si fermerà se un comando restituirà un codice di uscita diverso da zero, che è il modo standard unix per segnalare che qualcosa è andato storto.
Se vuoi ottenere log migliori, dovresti guardare ts
nel moreutils
pacchetto debian/ubuntu. Prefisserà ogni riga con un timestamp e lo stamperà. Così puoi vedere quando le cose stavano accadendo.
Soluzione 5:
Seguendo ciò che altri hanno detto, il manuale del set è una buona risorsa. Ho messo:
#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x
All'inizio degli script desidero continuare, o set -ex
se dovrebbe uscire in caso di errore.