GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je enregistrer entièrement toutes les actions des scripts bash ?

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 :

  1. 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.

  2. 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.

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

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

À 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.


Linux
  1. Comment faire écho à une nouvelle ligne dans les scripts shell bash

  2. Comment compresser tous les fichiers ou des fichiers spécifiques sous Linux

  3. Comment puis-je tuer le port TCP 16969 dans Bash ?

  4. Comment puis-je lister tous les vhosts dans nginx

  5. Exécutez tous les scripts shell dans le dossier

Comment exécuter tous les scripts dans un répertoire sous Linux

Comment analyser les fichiers CSV dans les scripts Bash sous Linux

Comment créer des documents avec des scripts Bash

Comment utiliser la commande echo dans les scripts Bash sous Linux

Comment travailler avec l'instruction Case dans les scripts Bash

Comment puis-je supprimer tous les travaux arrêtés ?