Main menu:

Site search

Categories

septembre 2025
L M M J V S D
1234567
891011121314
15161718192021
22232425262728
2930  

Archive

Utiliser ses propres journaux d’événements

Sous Linux, les journaux d’événements (log en anglais) sont centralisés. il y a un daemon syslogd qui implémente le protocole syslog et gère les différents fichiers de log du système.
Ces fichiers sont très important pour résoudre des problèmes de fonctionnement ou de plantage.
Ma question du jour est: est-il possible d’utiliser cette facilité pour ses propres scripts ou programmes? Ce que je veux c’est un fichier .log qui ne soit utilisé que par mes programmes et qui soit situé, comme tous les autres fichiers de log du système, dans le répertoire /var/log.

Sans entrer dans les détails du fichier /etc/syslog.conf, il existe un certain nombre de fichiers standards comme par exemple (extrait du fichier /etc/syslog.conf):

kern.*				-/var/log/kern.log
mail.info			-/var/log/mail.info
news.crit			/var/log/news/news.crit

On peut voir par exemple que les événements concernant le mail sont écrits dans le fichier /var/log/mail.log. Le protocole syslog définit un certain nombres de facilités (facility). vous en voyez des exemples ici: mail, kern, lpr, user,news,… et huit priorités (priority) différentes:

  • Emerg (emergency)
  • Alert
  • Crit (critical)
  • Err (error)
  • Warning
  • Notice
  • Info
  • Debug

l’astérisque dans le couple facility.priority signifie que le fichier utilisé doit être celui qui est spécifié peu importe le niveau de priorité.

Ce qui nous intéresse, c’est qu’il existe huit facilités définissables par l’utilisateur ou par tout programme pour lequel il n’existerait pas de facilité par défaut dans syslog. Il s’agit des facilités local0 à local7. Autrement dit, il nous suffit d’ajouter dans le fichier /etc/syslog.conf une ligne du genre:

local0.*			-/var/log/michel.log

Je ne spécifie pas de priorité et le fichier dans lequel les événements sont écrits doit être /var/log/michel.log. le devant signifie que les messages ne doivent pas nécessairement être écrits directement dans le fichier mais que leur écriture peut être différée. Ceci n’a d’importance que pour des messages vraiment critiques qui en cas de plantage pourraient ne pas être écrits dans le fichier de log.

Ok, il reste une petite chose à faire: relancer le daemon syslogd pour que nos changements dans le fichier /etc/syslog.conf soit pris en compte:

$ sudo /etc/init.d/sysklogd restart

Maintenant nous sommes prêts à écrire nos messages dans le fichier de log /var/log/michel.log comme nous le voulions. Mais comment faire?

Dans un script shell, c’est facile, il existe une commande qui permet d’écrire dans un fichier de log:

$ logger -p local0.notice -t TEST Test de log

le switch -p spécifie le couple facilité.priorité. La priorité n’a pas d’importance pour nous.
le -t spécifie un tag que l’on peut afficher au début du message, le nom du programme qui a généré le message par exemple.
Le résultat de la commande se trouve donc dans le fichier /var/log/michel.log comme voulu:

$ more /var/log/michel.log
Sep 13 09:48:26 LinuxPC TEST: Test de log

Faire la même chose dans un programme écrit en python est à peine plus compliqué:

#!/usr/bin/env python

import syslog

syslog.openlog('TEST', 0, syslog.LOG_LOCAL0)
syslog.syslog(syslog.LOG_INFO,'Test de log en python')
syslog.closelog()

Je vous invite à jeter un oeil à la documentation du module syslog pour connaître les différentes constantes utilisables.

Voici la même chose en C++:

# include <string>
# include <syslog.h>

int main()
{
  std::string message = "TEST";
  openlog(message.c_str(), 0, LOG_LOCAL0);
  syslog(LOG_INFO,"Test de log en C++");
  closelog();
  return EXIT_SUCCESS;
}

Un conseil, abusez des fichiers de log dans vos scripts et vos programmes. Je vous assure que cela rend de grand services en cas de problème. C’est d’autant plus vrai si vous distribuez vos programmes parce que c’est toujours sur une autre machine que la vôtre que les plantages arrivent et vous serez content que votre client puisse vous envoyer le fichier de log de votre programme.

Relancer un téléchargement interrompu

Ceci n’est pas une nouveauté mais je le rappelle parce que c’est bien pratique.
Il m’arrive souvent de télécharger de gros fichiers de podcast qui ont une taille supérieure à 100Mb voire même supérieure à 150Mb. Et ça me rend fou quand, pour une raison inconnue, le téléchargement s’interrompt comme par hasard juste avant la fin.

La plupart des serveurs ftp actuels sont capables de reprendre un téléchargement à l’endroit exact où il s’est interrompu précédemment. Cela s’appelle la fonction resume. Par contre, tous les navigateurs actuels n’en sont pas encore tous capables. Ce n’est pas très grave parce qu’il existe sous Linux un petit utilitaire très pratique et bien connu qui permet de faire cela. il s’agit du très connu wget.

Il suffit, en ligne de commande, de taper:

$ wget -c le_fichier_à_télécharger

Par exemple:

wget -c http://podaudio.rtbf.be/pod/C21-HELL_CLASSIC_21_HELL_S_BELLS_6-9-2008_5931636.mp3

Si le téléchargement s’interrompt, faites un Ctrl+C et retapez la commande. Le téléchargement reprendra là où il s’est interrompu.
Si ce n’est pas le cas, c’est que le serveur ne permet pas la fonction resume. Dans ce cas, rien à faire, il faudra tout re-télécharger.

vlc – un magnétoscope dans votre PC

Ceci n’a rien d’une astuce et est, au contraire, documenté sur le site de vlc. Néanmoins, cela semble peu connu. La preuve, c’est que j’ignorais même que c’était possible 😉 Mais que ne peut-on faire avec vlc? C’est bien le programme le plus extraordinaire que l’on puisse trouver dans le domaine du multimedia. Il fait tout! Il lit les vidéos, les fichiers audio, les dvd, tout type de stream. Il accepte un nombre de codecs impressionnant sans qu’on ne doive ajouter quoique ce soit comme plugin ou librairie. Et en plus, vous pouvez même le transformer en magnétoscope. Oui oui, vous pouvez lui dire quel jour, à quel heure commencer à enregistrer un stream et lui spécifier à quel heure et à quelle date arrêter l’enregistrement.

Honnêtement, ce n’est pas évident à faire. Ce n’est pas possible depuis l’interface graphique et ce n’est pas possible non plus depuis un terminal. En fait, vlc dispose d’une interface telnet et c’est via celle-ci qu’il est possible d’enregistrer votre flux comme si vlc était un magnétoscope.

La première chose à faire est de lancer l’interface telnet. Vous pouvez le faire depuis un terminal en tapant:

$ vlc -I telnet

Ensuite, ouvrez une session telnet sur le port 4212 depuis une console:

$ telnet localhost 4212

vlc vous demande un mot de passe. Par défaut, le mot de passe est « admin » sans les guillemets.
Imaginons maintenant que vous désiriez enregistrer le stream provenant de la chaîne de télé france24 entre 20h30 et 22h15, tapez dans votre console telnet les commandes suivantes:

new record broadcast enabled input http://88.191.49.63:443 output std{access=file,mux=ts,dst=/home/user/recording_2008-08-29.avi}
new start schedule enabled date 2008/08/29-20:30:00 append control record play
new end schedule enabled date 2008/08/29-22:15:00 append control record stop

Remplacez dans la commande new record… le nom de fichier par celui que vous voulez, précédé de son path. Si vous le désirez, vlc se fera même un plaisir de vous l’enregistrer au format ogg si vous préférez. Pour cela, il faut juste changer l’extension du fichier.

Modifier la bannière du login ssh

Sur un serveur de production sur lequel on se connecte régulièrement en ssh, la bannière affichée par Ubuntu devient vite fatiguante.

Linux coserv 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686

The programs included with the Ubuntu system are free 
software; the exact distribution terms for each program are 
described in the individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the 
extent permitted by applicable law.

Last login: Wed Aug 20 14:43:38 2008 from pp152.hf.rtbf.be

Le disclaimer et le copyright, une fois qu’on les a lus, pourraient être remplacés par quelque chose de plus ‘fun’.
Dans mon cas, j’ai choisi d’afficher en grand le nom du serveur en ASCII Art. Le programme que j’ai utilisé pour cela s’appelle figlet et est disponible dans les dépôts Ubuntu.
Voici ce que cela donne:

Linux coserv 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686

   ooooo     ooo  .o8                                   .               
   `888'     `8' "888                                 .o8               
    888       8   888oooo.  oooo  oooo  ooo. .oo.   .o888oo oooo  oooo  
    888       8   d88' `88b `888  `888  `888P"Y88b    888   `888  `888  
    888       8   888   888  888   888   888   888    888    888   888  
    `88.    .8'   888   888  888   888   888   888    888 .  888   888  
      `YbodP'     `Y8bod8P'  `V88V"V8P' o888o o888o   "888"  `V88V"V8P' 

   
Last login: Wed Aug 20 14:43:38 2008 from pp152.hf.rtbf.be

Le fichier à modifier pour y placer votre nouvelle bannière est /etc/motd.

Si le coeur vous en dit, vous pouvez également supprimer l’affichage du dernier login en modifiant dans le fichier /etc/ssh/sshd_config

PrintLastLog yes

par

PrintLastLog no

Serveur mandataire (proxy)

Dans un environnement industriel, il n’est pas rare de devoir passer par un serveur proxy pour avoir accès à Internet. Si vous utilisez la version desktop d’Ubuntu, il vous suffit de vous rendre dans le menu Système/Préférences/Serveur mandataire. Par contre si vous utilisez la version serveur d’Ubuntu sans interface graphique, cette option n’existe pas mais le proxy reste nécessaire ne fut-ce que pour pouvoir faire les mises à jour au moyen d’apt-get ou d’aptitude.
Deux solutions sont possibles.

1. Créer un fichier /etc/apt/apt.conf et y mettre la ligne suivante:

Acquire::http:Proxy "http://mon_proxy.mon_domaine.com:port/";

Il faut évidemment remplacer l’adresse et le port par celle du proxy.

2. Initialiser la variable d’environnement http_proxy avec l’adresse du proxy. Ceci peut se faire soit de manière globale dans /etc/profile soit, par utilisateur, dans le fichier ~/.bashrc. Il suffit d’ajouter la ligne suivante au fichier:

export http_proxy=http://mon_proxy.mon_domaine.com:port/

Remplacez l’adresse et le port par celle du proxy. Cette méthode a aussi l’avantage de rendre l’adresse du proxy disponible pour d’autres applications qui en auraient besoin.

Planification de tâches – la commande at

Lorsque vous voulez planifier le lancement d’une tâche de manière répétitive (tous le jours, toutes les heures, le 1er janvier…) vous utilisez la command cron. Par contre, si cette tâche ne doit être lancée qu’une seule fois, vous utiliserez la command at.
La commande at est une commande très facile à utiliser. Il suffit de taper dans un terminal at suivi de l’heure, le jour où la tâche devra être exécutée. Par exemple:

$ at 16:45
$ at 16:45 010109
$ at midnight
$ at now  # très utile pour les tests
$ at 16:45 + 3 days

Elle s’utilise soit de façon interactive soit en ligne de commande.

Méthode interactive

Vous tapez dans un terminal la commande at suivi de l’heure, le jour… et en retour vous obtenez un prompt qui vous permet de taper la commande à lancer à l’heure dite. Pour sortir, tapez Ctrl+D.

$ at 16:45
warning: commands will be executed using /bin/sh
at> backup.sh
at> 
job 14 at Sun Aug 17 16:45:00 2008

Essayons maintenant de lancer la calculatrice Gnome à une certaine heure:

$ at 16:45
warning: commands will be executed using /bin/sh
at> gcalctool
at> 
job 15 at Sun Aug 17 16:45:00 2008

Et…à l’heure promise, rien ne se passe. Pourquoi?
Parce que at utilise /bin/sh et que toutes les variables d’environnement sont transmises à l’exception de TERM, DISPLAY et « _ ». Cela signifie simplement, dans notre cas, que at ne sait pas dans quel DISPLAY afficher le programme puisque votre variable d’environnement DISPLAY ne lui est pas transmise. Pour résoudre ce problème, il suffit de dire à la commande at sur quel DISPLAY afficher la calculatrice Gnome.

$ at 11:51
warning: commands will be executed using /bin/sh
at> export DISPLAY=:0.0
at> gcalctool
at> 
job 15 at Sun Aug 17 11:51:00 2008

Notez la commande export DISPLAY=:0.0.

Méthode en ligne de commande

at attend la tâche à exécuter sur son entrée standard (stdin) et non pas comme paramètre de la commande. Cela signifie que la tâche ne peut pas être transmise à la commande at en argument. C’est la que les redirections sous Linux interviennent. Relisez éventuellement mon article Shell – Redirections de flux.
Nous allons utilser un pipe ‘|’ pour rediriger la sortie standard (stdout) d’un programme vers l’entrée standard (stdin) de la commande at.

$ echo "backup.sh" | at 16:45

On prend la sortie standard de la commande echo et on la redirige vers l’entrée standard de la commande at grâce au pipe. C’est aussi simple que ça.
Vous voulez lancer la calculatrice Gnome? Là aussi, vous devez préciser le DISPLAY à utiliser.

$ echo "export DISPLAY=:0.0;gcalctool" | at 16:45

Pour supprimer une tâche, utilisez atrm suivi du numéro de la tâche. Pour afficher toutes les tâches qui sont pendantes, utilisez atq.
N’oubliez pas de consulter la page de manuel de at pour avoir tous les détails.