Chcę przechwycić WSZYSTKIE dane z dzienników, zarówno z komunikatami o błędach, z danych wyjściowych skryptu i przekierować je wszystkie do pliku dziennika.
Mam skrypt jak poniżej:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
Chcę zobaczyć wszystkie działania w pliku /home/scripts/cron/logs
Ale widzę tylko to, co wstawiłem po poleceniu echa.
Jak sprawdzić w dziennikach, czy polecenie SSH zakończyło się pomyślnie?
Muszę zebrać wszystkie dane z dzienników. Potrzebuję tego, aby monitorować wynik każdego polecenia w moim skrypcie, aby lepiej analizować, co się dzieje, gdy skrypt nie działa.
Odpowiedzi:
Ogólnie na początku każdego skryptu umieszczam coś podobnego do następującego (zwłaszcza jeśli będzie działał jako demon):
Wyjaśnienie:
exec 3>&1 4>&2
Zapisuje deskryptory plików, aby można je było przywrócić do tego, czym były przed przekierowaniem, lub wykorzystać je do wyprowadzenia tego, co było przed następnym przekierowaniem.
trap 'exec 2>&4 1>&3' 0 1 2 3
Przywróć deskryptory plików dla określonych sygnałów. Nie jest to na ogół konieczne, ponieważ należy je przywrócić po wyjściu podpowłoki.
exec 1>log.out 2>&1
Przekieruj
stdout
do pliku,log.out
a następnie przekierujstderr
dostdout
. Pamiętaj, że kolejność jest ważna, gdy chcesz, aby trafiły do tego samego pliku.stdout
musi zostać przekierowany, zanimstderr
zostanie przekierowany dostdout
.Odtąd, aby zobaczyć dane wyjściowe na konsoli (być może), możesz po prostu przekierować na
&3
. Na przykład,pójdzie tam, gdzie
stdout
został skierowany, prawdopodobnie na konsolę, przed wykonaniem linii 3 powyżej.źródło
trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN
. Pseudo sigspec RETURN deskryptory plików przywracają za każdym razem, gdy funkcja powłoki lub skrypt są wykonywane przy pomocy. lub wbudowane źródła kończą wykonywanie. Z tego (i innych powodów) w moich skryptach dodaję jako ostatnie 2 wiersze:return
&exit 0
- Tylko moje 2 centy, wyrazy uznania dla ciebie @nicerobot!trap
sygnałów wygląda nieco dziwnie. Zwykle też chcesz to uwzględnić15
.aby uzyskać wyjście ssh do twojego pliku dziennika, musisz przekierować
stderr
nastdout
. możesz to zrobić, dołączając2>&1
po skrypcie bash.To powinno wyglądać tak:
gdy to nie wyświetla wiadomości w odpowiedniej kolejności, spróbuj dodać kolejną podpowłokę:
źródło
( ... ) |& tee output.log
Kiedy czytam twoje pytanie, nie chcesz rejestrować danych wyjściowych, ale cała sekwencja poleceń, w którym to przypadku inne odpowiedzi ci nie pomogą.
Wywołaj skrypty powłoki z opcją -x, aby wyświetlić wszystko:
sh -x foo.sh
Zaloguj się do pliku, który chcesz:
sh -x foo.sh >> /home/scripts/cron/logs
źródło
W bash możesz umieścić,
set -x
a następnie wydrukuje każde wykonane polecenie (i zmienne bash). Możesz to wyłączyć za pomocąset +x
.Jeśli chcesz być paranoikiem, możesz wpisać
set -o errexit
swój skrypt. Oznacza to, że skrypt zawiedzie i zatrzyma się, jeśli jedno polecenie zwróci niezerowy kod wyjścia, co jest standardowym sposobem uniksowym sygnalizującym, że coś poszło nie tak.Jeśli chcesz uzyskać ładniejszy dzienników, należy spojrzeć
ts
wmoreutils
pakiecie debian / ubuntu. Poprzedzi każdą linię znacznikiem czasu i wydrukuje ją. Możesz więc zobaczyć, kiedy coś się działo.źródło
Zgodnie z tym, co powiedzieli inni, zestaw instrukcji jest dobrym źródłem. Włożyłem:
Na górze skryptów chcę kontynuować, lub
set -ex
jeśli powinien zakończyć się po błędzie.źródło
ssh -vv
?