Solution 1 :
Je mets généralement quelque chose de similaire à ce qui suit au début de chaque script (surtout s'il s'exécute en tant que 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 :
-
exec 3>&1 4>&2
Enregistre les descripteurs de fichiers afin qu'ils puissent être restaurés tels qu'ils étaient avant la redirection ou utilisés eux-mêmes pour générer ce qu'ils étaient avant la redirection suivante.
-
trap 'exec 2>&4 1>&3' 0 1 2 3
Restaurer les descripteurs de fichiers pour des signaux particuliers. Généralement pas nécessaire puisqu'ils doivent être restaurés à la sortie du sous-shell.
-
exec 1>log.out 2>&1
Rediriger
stdout
déposerlog.out
puis redirigezstderr
àstdout
. Notez que l'ordre est important lorsque vous voulez qu'ils aillent dans le même fichier.stdout
doit être redirigé avantstderr
est redirigé versstdout
.
À 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 où stdout
a été dirigé, vraisemblablement la console, avant d'exécuter la ligne 3 ci-dessus.
Solution 2 :
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 ...
lorsque cela n'affiche pas les messages dans le bon ordre, essayez d'ajouter un autre sous-shell :
#!/bin/bash
((
...
) 2>&1) | tee ...
Solution 3 :
Comme je lis 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 de votre choix avec :
sh -x foo.sh >> /home/scripts/cron/logs
Solution 4 :
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 scénario. Cela signifie que le script échouera et s'arrêtera si une commande renvoie un code de sortie différent de zéro, ce qui est le moyen standard Unix de signaler que quelque chose s'est mal passé.
Si vous voulez obtenir des journaux plus agréables, vous devriez regarder 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.
Solution 5 :
Suite à ce que d'autres ont dit, le manuel de l'ensemble est une bonne ressource. J'ai mis :
#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x
En haut des scripts je souhaite continuer, ou set -ex
s'il doit se fermer en cas d'erreur.