GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu plně zaznamenat všechny akce bash skriptů?

Řešení 1:

Obecně dávám na začátek každého skriptu něco podobného následujícímu (zejména pokud poběží jako démon):

#!/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':

Vysvětlení:

  1. exec 3>&1 4>&2

    Ukládá deskriptory souborů, takže je lze obnovit do stavu, v jakém byly před přesměrováním, nebo je použít k výstupu do stavu, v jakém byly před následujícím přesměrováním.

  2. trap 'exec 2>&4 1>&3' 0 1 2 3

    Obnovte deskriptory souborů pro konkrétní signály. Obecně to není nutné, protože by měly být obnoveny při ukončení sub-shell.

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

    Přesměrování stdout do souboru log.out pak přesměrujte stderrstdout . Všimněte si, že pořadí je důležité, když chcete, aby šly do stejného souboru. stdout musí být přesměrován před stderr je přesměrován na stdout .

Od té doby, abyste viděli výstup na konzole (možná), můžete jednoduše přesměrovat na &3 . Například,

echo "$(date) : part 1 - start" >&3

přejde kamkoli stdout byl směrován, pravděpodobně konzole, před provedením řádku 3 výše.

Řešení 2:

Chcete-li získat výstup ssh do souboru protokolu, musíte přesměrovat stderr na stdout . můžete to provést přidáním 2>&1 po vašem bash skriptu.

mělo by to vypadat takto:

#!/bin/bash
(
...
) 2>&1 | tee ...

když se nezobrazují zprávy ve správném pořadí, zkuste přidat další subshell:

#!/bin/bash
((
...
) 2>&1) | tee ...

Řešení 3:

Jak čtu vaši otázku, nechcete protokolovat výstup, ale celou sekvenci příkazů, v takovém případě vám ostatní odpovědi nepomohou.

Vyvolejte skripty shellu s -x pro výstup všeho:

sh -x foo.sh

Přihlaste se k požadovanému souboru pomocí:

sh -x foo.sh >> /home/scripts/cron/logs

Řešení 4:

V bash můžete zadat set -x a poté vypíše každý příkaz, který provede (a proměnné bash). Můžete jej vypnout pomocí set +x .

Pokud chcete být paranoidní, můžete zadat set -o errexit ve vašem skriptu. To znamená, že skript selže a zastaví se, pokud jeden příkaz vrátí nenulový výstupní kód, což je standardní unixový způsob, jak signalizovat, že se něco pokazilo.

Pokud chcete získat hezčí protokoly, měli byste se podívat na ts v moreutils balíček debian/ubuntu. Před každým řádkem se nastaví časové razítko a vytiskne se. Takže můžete vidět, kdy se věci děly.

Řešení 5:

V návaznosti na to, co řekli ostatní, je návod k nastavení dobrým zdrojem. Dal jsem:

#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x

V horní části skriptů chci pokračovat, nebo set -ex pokud se má při chybě ukončit.


Linux
  1. Jak zkontrolovat, zda Bash může tisknout barvy?

  2. Jak zopakovat nový řádek ve skriptech Bash Shell

  3. Jak mohu zabít TCP port 16969 v Bash?

  1. Jak mohu vypsat všechny vhosty v nginx

  2. Jak mohu zaznamenat všechna spuštění procesů v Linuxu?

  3. Jak mohu zabít všechny zastavené úlohy?

  1. Jak gzipovat všechny nebo konkrétní soubory v Linuxu

  2. Jak zvýraznit Bash skripty ve Vimu?

  3. Jak mohu rychle sečíst všechna čísla v souboru?