Je veux capturer TOUTES les données des journaux, à la fois avec des messages d'erreur, à partir de la sortie de mon script et les rediriger vers un fichier journal.
J'ai un 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 je mets après la commande echo.
Comment vérifier les journaux si la commande SSH a réussi?
J'ai besoin de rassembler toutes les données de journaux. J'ai besoin de cela pour surveiller le résultat de chaque commande de mon script, afin de mieux analyser ce qui se passe lorsque le script échoue.
Réponses:
Je mets généralement quelque chose de similaire au suivant au début de chaque script (surtout s'il fonctionnera en tant que démon):
Explication:
exec 3>&1 4>&2
Enregistre les descripteurs de fichier afin qu’ils puissent être restaurés sur ce qu’ils étaient avant la redirection ou utilisés eux-mêmes pour une sortie sur ce qu’ils étaient avant la redirection suivante.
trap 'exec 2>&4 1>&3' 0 1 2 3
Restaurez les descripteurs de fichier pour des signaux particuliers. Généralement non nécessaire car ils doivent être restaurés à la sortie du sous-shell.
exec 1>log.out 2>&1
Rediriger
stdout
vers un fichierlog.out
puis redirigerstderr
versstdout
. Notez que l'ordre est important lorsque vous voulez qu'ils soient dans le même fichier.stdout
doit être redirigé avant d'stderr
être redirigé versstdout
.A partir de là, pour voir la sortie sur la console (peut-être), vous pouvez simplement rediriger vers
&3
. Par exemple,ira à l’endroit où a
stdout
été dirigé, probablement la console, avant d’exécuter la ligne 3 ci-dessus.la source
trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN
. Les descripteurs de fichier de restauration de pseudo sigspec RETURN à chaque fois qu'une fonction shell ou un script est exécuté avec le script. ou les sources intégrées se terminent. Pour cela (et pour d’autres raisons), dans mes scripts, j’ajoute les deux dernières lignes:return
&exit 0
- Seulement mes 2 cents, bravo à @nicerobot!trap
signaux semble légèrement bizarre. Habituellement, vous voudrez également inclure15
.pour obtenir la sortie ssh dans votre fichier journal, vous devez rediriger
stderr
versstdout
. vous pouvez le faire en ajoutant2>&1
après votre script bash.ça devrait ressembler à ça:
si cela n’affiche pas les messages dans le bon ordre, essayez d’ajouter un autre sous-shell:
la source
( ... ) |& tee output.log
En lisant votre question, vous ne voulez pas enregistrer la sortie, mais toute la séquence de commandes, auquel cas les autres réponses ne vous aideront pas.
Appelez les scripts shell avec -x pour tout afficher:
sh -x foo.sh
Connectez-vous au fichier que vous voulez avec:
sh -x foo.sh >> /home/scripts/cron/logs
la source
Dans bash, vous pouvez mettre
set -x
et il imprimera toutes les commandes qu'il exécute (et les variables bash) par la suite. Vous pouvez l'éteindre avecset +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 renvoyait un code de sortie non nul, qui est le moyen standard Unix de signaler que quelque chose s'est mal passé.Si vous voulez obtenir de meilleurs journaux, vous devriez regarder
ts
dans lemoreutils
paquet debian / ubuntu. Il préfixera chaque ligne avec un horodatage et l’imprimera. Ainsi, vous pouvez voir quand les choses se passaient.la source
Pour faire suite à ce que d’autres ont dit, le manuel d’ installation est une bonne ressource. Je mets:
Au sommet des scripts, je souhaite continuer, ou
set -ex
s'il doit se fermer en cas d'erreur.la source
ssh -vv
- être ?