Ř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í:
-
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.
-
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.
-
exec 1>log.out 2>&1
Přesměrování
stdout
do souborulog.out
pak přesměrujtestderr
ažstdout
. 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ředstderr
je přesměrován nastdout
.
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.