102 votes

Comment puis-je enregistrer toutes les actions de bash scripts ?

À partir de la sortie de mon script, je veux capturer TOUTES les données des journaux avec les messages d'erreur et les rediriger toutes vers le fichier journal.

J'ai script comme ci-dessous :

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

Je veux voir toutes les actions dans le fichier /home/scripts/cron/logs

Mais je ne vois que ce que j'ai mis après echo commandement.

Comment vérifier dans les journaux que SSH a réussi ?

J'ai besoin de rassembler tous les journaux. J'en ai besoin pour surveiller le résultat de chaque commande de mon script, pour mieux analyser ce qui se passe pendant que le script échoue.

150voto

Daniel Crenna Points 1853

Je mets généralement quelque chose de similaire à ce qui suit au début de chaque script (surtout s'il sera exécuté comme un 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':

Explication :

  1. exec 3>&1 4>&2

    Sauvegarde les descripteurs de fichiers afin qu'ils puissent être restaurés à ce qu'ils étaient avant la redirection ou utilisés eux-mêmes pour sortir à ce qu'ils étaient avant la redirection suivante.

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

    Restaurer les descripteurs de fichiers pour des signaux particuliers. Pas généralement nécessaire puisqu'ils doivent être restaurés lorsque le sub-Shell sort.

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

    Rediriger stdout au dossier log.out puis rediriger stderr à stdout . Notez que l'ordre est important lorsque vous voulez qu'ils aillent dans le même fichier. stdout debe être redirigé avant stderr est redirigé vers stdout .

A partir de là, pour voir la sortie sur la console (peut-être), vous pouvez simplement rediriger vers &3 . Par exemple,

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

ira partout où stdout a été dirigé, vraisemblablement vers la console, avant l'exécution de la ligne 3 ci-dessus.

29voto

Alex Holst Points 2180

Si je lis votre question, vous ne voulez pas enregistrer la sortie, mais la séquence entière de commandes, auquel cas, les autres réponses ne vous aideront pas.

Invoquez Shell Shell avec -x pour tout sortir :

sh -x foo.sh

Connectez-vous au fichier que vous voulez avec :

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

25voto

Christian Points 4555

Pour obtenir la sortie ssh dans votre fichier journal, vous devez rediriger stderr à stdout . vous pouvez le faire en ajoutant 2>&1 après votre script bash.

ça devrait ressembler à ça :

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

si cela n'affiche pas les messages dans le bon ordre, essayez d'ajouter un autre sous-shell :

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

15voto

mblsha Points 305

En bash, vous pouvez mettre set -x et il imprimera chaque commande qu'il exécute (et les variables bash) après cela. Vous pouvez le désactiver avec set +x .

Si vous voulez être paranoïaque, vous pouvez mettre set -o errexit dans votre script. Cela signifie que le script échouera et s'arrêtera si une commande renvoie un code de sortie non nul, ce qui est la manière standard unix de signaler que quelque chose a mal tourné.

Si vous souhaitez obtenir des journaux plus agréables, vous devriez vous tourner vers ts dans le moreutils paquet debian/ubuntu. Il préfixera chaque ligne avec un horodatage et l'imprimera. Ainsi vous pouvez voir quand les choses se passent.

4voto

Nils Points 1885

Pour faire suite à ce que les autres ont dit, l'ensemble manuel est une bonne ressource. J'ai mis :

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

Au sommet de scripts je souhaite continuer, ou bien set -ex s'il doit sortir en cas d'erreur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X