Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/06/2011, 12h41   #1
Membre à l'essai
 
Roman Adamski
Inscription : décembre 2010
Messages : 20
Détails du profil
Informations personnelles :
Nom : Roman Adamski
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2010
Messages : 20
Points : 20
Points : 20
Par défaut formater un message de log

Bonjour,

J'ai actuellement plusieurs scripts bash dont certains peuvent être assez long et tous possèdent de nombreux cas d'erreur qu'il est rarement possible de résoudre à l'intérieur même du script (permissions d'accès aux fichier, ...). J'ai donc rajouter la commande suivante au début de mes scripts pour logger les différentes erreurs dans un fichier :
où $log représente un chemin vers mon fichier de log. Jusque là tout fonctionne.

Mais comme j'ai plusieurs scripts tournant en cronjob toutes les nuits, j'aimerais pouvoir rajouter avant chaque entrée une chaine spécifique pour pouvoir identifier mon script et préciser qu'il s'agit d'une erreur. (En cas de problème, grep est mon ami pour parser le fichier de log et m'aider à trouver la cause du problème)
En bonus j'aimerais également pouvoir rajouter la date et heure au moment d'effectuer le log (et pas au moment de d'initialiser le script sinon ce serait trop facile ).

J'ai donc essayé de partir sur quelque chose comme :
Code :
1
2
 
exec 2> echo 'CRONJOB:nomduscript.sh:ERROR ; '$(date)' '$0 >> $log
avec diverses variantes, mais bien sur çà ne fonctionne pas absolument pas. J'imagine que je dois utiliser une autre commande que 'echo', et qu'il y a probablement des erreurs de syntaxe. Pourriez m'orienter dans la bonne direction svp ?
Roman_Adamski est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/07/2011, 11h17   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Comment est le script ?

si il utilises des fonctions
tu peux rediriger ou tunneler les retours.
Code :
1
2
3
4
5
 
mafocntion()
{
....
} | echo "........................" >> LOG
utilise exec sur le script appelant comme tu tentes de le faire, j'ai jamais essayé, c'est pas forcément illogique mais j'ignore si cette méthode fonctionne donc je propose plus simple
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/07/2011, 15h03   #3
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Et en utilisant la commande "trap" ?

Code :
1
2
3
#! /bin/bash

trap 'echo "$(date +"%A %d %B %Y %T") : ERROR PROGRAMME $0 : LIGNE : $LINENO" >> fich.log' ERR
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 05/07/2011, 16h19   #4
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par zipe31 Voir le message
Salut,

Et en utilisant la commande "trap" ?

Code :
1
2
3
#! /bin/bash

trap 'echo "$(date +"%A %d %B %Y %T") : ERROR PROGRAMME $0 : LIGNE : $LINENO" >> fich.log' ERR
bien vu ça doit marcher..
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 19h04   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

je ne crois pas
trap -l ne montre pas de signal ERR que trap pourrait intercepter(?).

pour un debuggage ponctuel, on pourrait avoir une option (ou un test sur "$-" pour savoir s'il comporte "x") qui place set -x, initialise PS4 pour être adaptée à la sortie désirée, et rediriger la sortie d'erreur dans un fichier log...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/07/2011, 19h38   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Citation:
Envoyé par N_BaH Voir le message
Bonjour,

je ne crois pas
trap -l ne montre pas de signal ERR que trap pourrait intercepter(?)
Chez moi non plus et pourtant ça marche

Normalement c'est pour du ksh, mais avec bash ça marche aussi...
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/07/2011, 19h58   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
évidemment...
si je ne lis pas le fichier de log, je ne verrai jamais que ça a fonctionné.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 20h54   #8
Membre à l'essai
 
Roman Adamski
Inscription : décembre 2010
Messages : 20
Détails du profil
Informations personnelles :
Nom : Roman Adamski
Âge : 26
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2010
Messages : 20
Points : 20
Points : 20
Bonsoir,

Merci pour vos nombreuses réponses.

@frp31 :
Il s'agit en réalité de plusieurs scripts bash tournant en cronjob chaque nuit. Parmi leurs différentes tâches il y a nettoyer les vieilles images du cache du serveur WEB (ce qui implique l'utilisation de la commande rm, ainsi qu'une connexion en base de donnée), et réaliser des fichiers de statistiques ce qui implique l'utilisation de commandes touch, de nombreuses commandes de formatages et de calcul et l'accès à une base de données également.

Mettre des tests sur les valeurs de retour de chaque commande n'est pas une bonne idée car je pourrais rarement traiter l'erreur au sein même du script (exemple : une commande rm ne pouvant s'exécuter car après une mise à jour du site, les droits d'écriture pour le script ont disparu, un changement de la structure de la BDD et un oubli de mise à jour du script, etc.) et celà rendra mes scripts très rapidement illisible.

L'utilisation de la commande exec me permet de rediriger stderr vers mon fichier de log pour toute la durée d'exécution de mon script, ce qui est très pratique puisque je n'ai plus besoin de tester chaque valeur de retour de chaque commande pour y implémenter mon écriture vers mon fichier de log.


Je n'utilise pas de fonction actuellement dans mes scripts, mais celà peut être une bonne idée vu que je n'arrive pas à faire ce que je veux avec echo.
Je viens donc de tester ce script :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
#!bin/sh
 
mafonction()
{
	read pipe
	echo 'CRONJOB : test.sh : ERROR ; '$(date)' '$pipe >> ./test.log
}
 
exec 2>> mafonction()
 
rm bidouille
manque de chance j'obtiens une erreur de syntaxe... Y-a-t-il un moyen de rediriger stderr vers mafonction() ?!?

@zipe31 :
Je n'ai actuellement pas de man page pour la commande trap sur ma debian (fraichement mise à jour) mais après test, c'est effectivement de çà dont j'aurais besoin. Il ne me reste plus qu'à lire la man page sur le net et trouver un équivalent pour sh (et non pas bash, dsl pour l'erreur de débutant )

En remplaçant le exec par la ligne que tu m'a fourni dans le mini-script précédent j'obtiens la sortie suivante :
Code :
1
2
 
mardi 05 juillet 2011 18:42:34 : ERROR PROGRAMME test.sh : LIGNE : 11
Ce qui est presque ce que je veux, il ne me manque que le message d'erreur de ma commande rm à concaténer à la fin.

Merci beaucoup ! Je poste la solution complète avec sh dès que j'ai trouvé, il commence à ce faire un peu tard pour ce soir.

P.S. :
J'ai remarqué le thread "trucs et astuces" épingler en haut de cette section du forum. Ca me parait être une entrée intéressante. zipe31, as-tu le temps d'y rédiger un message ? Sinon je le ferais en citant ton pseudo.
Roman_Adamski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h20   #9
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Ce qui est presque ce que je veux, il ne me manque que le message d'erreur de ma commande rm à concaténer à la fin.
Suffit de rajouter "2>>fich.log" après tes commandes "rm" et le "trap" interceptera le message initial d'erreur.
Seul inconvénient le message d'erreur dans le fichier de log sera avant l'alerte

Citation:
Merci beaucoup ! Je poste la solution complète avec sh dès que j'ai trouvé
De rien et merci d'avance

Citation:
P.S. :
J'ai remarqué le thread "trucs et astuces" épingler en haut de cette section du forum. Ca me parait être une entrée intéressante. zipe31, as-tu le temps d'y rédiger un message ? Sinon je le ferais en citant ton pseudo.
Tu peux le faire, et pas la peine d'y rajouter mon pseudo, je n'aspire pas à la postérité , le principal est que l'information existe
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h36.


 
 
 
 
Partenaires

Hébergement Web