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>&2Salva 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 3Ripristina 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>&1Reindirizza
stdoutal filelog.outquindi reindirizzarestderrastdout. Nota che l'ordine è importante quando vuoi che vadano allo stesso file.stdoutdeve essere reindirizzato prima distderrviene 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.