Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 04/08/2017, à 09:31

Anard

Enregistrements de log et err

Bonjour,

Je cherche à ce qu'un script, lorsqu'il s'éxecute, enregistre au passage des fichiers script.log et script.err pour contrôler après coup que tout s'est bien passé.
Je voudrais que ce soit écrit directement dans le script pour n'avoir qu'à taper

./script.sh

Aussi, les sorties du terminal doivent apparaître pendant son éxecution car le script en question pose des questions à l'utilisateur.

J'ai trouvé ceci sur internet :

principale() {
... coeur du script
}

exec 3>&1
principale 3>script.log 2>&1 >&3 3>&- | tee script.err
exec 3>&- 

Ca fonctionne très bien sauf que le terminal n'affiche que les erreurs au moment de l'éxecution. Ce qui fait que les questions à l'utilisateur et les echo ne s'affichent pas à l'écran.
Comme je ne comprends pas bien le code que j'ai trouvé, je ne vois pas comment faire pour que le terminal affiche en temps réel à la fois le log et les erreurs.
Pourriez-vous m'aider ? Merci.

Dernière modification par Anard (Le 04/08/2017, à 10:48)


"iMack" : GA-B85M-D3H, Intel i5 4460, 8Go RAM, Intel HD4600, SSD 128+60Go / Bootloader Clover - macOS Sierra / Ubuntu Zesty Zapus / Windows 10
"Portable" : Samsung P200, Intel Core2Duo T8100, 3Go RAM, Radeon X1250, HDD 160Go / Grub2 - Xubuntu Xenial Xerus / Windows 10

Hors ligne

#2 Le 04/08/2017, à 16:16

kholo

Re : Enregistrements de log et err

bon, outre que rien ne se passe, il vaut mieux découper ce script et l'adapter à ta demande...
tente ça, tu y verras peut être plus clair

#!/bin/bash
function principale () {
	# ... coeur du script
	echo "bonjour, entrez votre nom"
	read nom
	echo "bonjour, une phrase vers >&3" >&3
	echo "monde, une phrase vers >&2" >&2
	echo "le un est lisible" >&1
	echo "par défaut aussi..."
}
principale 3>"script.log" 2>"script.err"

echo "le nom est $nom" 

exit 0

de mon côté j'utilise une journalisation avec une fonction :
déclaration du fichier de log
par exemple :

NOM_LOGICIEL="${0##*/}"
DIR_CONF="ou/tu/veux" # "$PWD" ou "$HOME/.config/${NOM_LOGICIEL}"...
FICHIER_LOG="${DIR_CONF}/${NOM_LOGICIEL}.log"
# ETAGE journal
function _journal () {
	# on vide le log ou on le crée si il n'existe pas
	> "${FICHIER_LOG}"
	journal "ouverture - $(date)"
	journal "\t\t\t\t\t------------------------"
	}
function journal () {
	echo -e "${@}" >> "${FICHIER_LOG}"
	}
_journal

ou avec horodatage :

START=$(date +%s.%N)
function _journal () {
	# cette partie pour conserver le journal
	# if [ -f "${FICHIER_LOG}" ]
	# then
		# echo "..."
	# else
		# echo "Création du fichier de log : $FICHIER_LOG"
		# touch "${FICHIER_LOG}"
	# fi
	> "${FICHIER_LOG}" # cette ligne pour initialiser le journal à chaque lancement
	journal "ouverture - $(date)"
	journal "\t\t\t\t\t------------------------"
	}
function journal () {
	local NOW=$(date +%s.%N)
	local DIFF=$(echo "${NOW} - ${START}" | bc)
	echo -e "[${DIFF}] ${@}" >> "${FICHIER_LOG}"
	# echo -e "${@}" >> "${FICHIER_LOG}"
	}
echo "ouverture du journal"
_journal

dans les deux cas j'appelle ma fonction avec du texte entre ""

journal "je met ce que je veux"

ou bien

journal "je met ce que je veux ${uneVariable} $($uneFonction "du texte...")"

Hors ligne

#3 Le 04/08/2017, à 22:14

Watael

Re : Enregistrements de log et err

$ maFonc() { echo "stdOut" >&1; read -p "bla: " var; echo "$var";}
$ maFonc 1> >(tee std.log) 2> >(tee err.log >&2)
stdOut
bla: poipoi
$ poipoi

$ cat err.log 
bla: $ 
$ cat std.log 
stdOut
poipoi

mais l'affichage merdoie, c'est perturbant. sad


eval, c'est mal.

Hors ligne

#4 Le 05/08/2017, à 09:49

Anard

Re : Enregistrements de log et err

Watael a écrit :

mais l'affichage merdoie, c'est perturbant. sad

?? Ah bon ? Je n'ai pas remarqué que l'affichage merdoie. C'est exactement ce que je voulais faire et ça fonctionne nickel chez moi.
Sauf quelques lignes qui se trouvent écrites dans mon fichier .err alors que ce ne sont pas des erreurs. Je ne sais pas pourquoi, mais elles doivent être considérées comme tel par le Terminal.

Merci beaucoup en tout cas.
@ kholo : j'ai essayé ta proposition, maius ne suis pas parvenu à mes fins... Faut dire que je débute en bash et ne comprends pas tout wink


"iMack" : GA-B85M-D3H, Intel i5 4460, 8Go RAM, Intel HD4600, SSD 128+60Go / Bootloader Clover - macOS Sierra / Ubuntu Zesty Zapus / Windows 10
"Portable" : Samsung P200, Intel Core2Duo T8100, 3Go RAM, Radeon X1250, HDD 160Go / Grub2 - Xubuntu Xenial Xerus / Windows 10

Hors ligne

#5 Le 05/08/2017, à 10:24

kholo

Re : Enregistrements de log et err

avant tout définir le fichier de log

NOM_LOGICIEL="${0##*/}" # récupère tout ce qui est après le dernier slash /
DIR_CONF="ou/tu/veux" # "$PWD" ou "$HOME/.config/${NOM_LOGICIEL}"... 
FICHIER_LOG="${DIR_CONF}/${NOM_LOGICIEL}.log"

maintenant le script sait où se trouve FICHIER_LOG

cette première fonction crée le fichier journal ou le vide si il existe déjà

function _journal () {
	# on vide le log ou on le crée si il n'existe pas
	> "${FICHIER_LOG}"
	journal "ouverture - $(date)"
	journal "\t\t\t\t\t------------------------"
	}

cette fonction journalise ; c'est elle qui envoie ce que je veux vers le fichier de log

function journal () {
	echo -e "${@}" >> "${FICHIER_LOG}"
	}

ensuite je lance la création ou le vidage du fichier qui est prêt à recevoir

_journal

maintenant, à chaque besoin, j'envoie une valeur dans mon fichier

journal "je met ce que je veux"

Hors ligne