GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso registrare completamente tutte le azioni degli script bash?

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:

  1. 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.

  2. 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.

  3. exec 1>log.out 2>&1

    Reindirizza stdout al file log.out quindi reindirizzare stderr a stdout . Nota che l'ordine è importante quando vuoi che vadano allo stesso file. stdout deve essere reindirizzato prima di stderr viene reindirizzato a stdout .

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.


Linux
  1. Come posso sommare rapidamente tutti i numeri in un file?

  2. Come posso eliminare la porta TCP 16969 in Bash?

  3. Come posso elencare tutti i vhost in nginx

  4. Come posso registrare tutti gli avvii di processo in Linux?

  5. Come posso trovare tutti i file hardlink su un filesystem?

Come eseguire tutti gli script in una directory in Linux

Come analizzare i file CSV negli script Bash in Linux

Come creare documenti con gli script Bash

Come utilizzare il comando echo negli script Bash in Linux

Come lavorare con l'istruzione Case negli script Bash

Come aggiungere un timestamp al registro degli script bash?