mai 20 2008

Problème de tâche planifiée : méfiez-vous de run-parts

Tag: Debian GNU/Linux, SystèmeSylvain @ 12:51

J’ai créé, il y a quelques temps, un petit script répondant au doux nom de « bonne_bouffe.sh » (m’avertissant par mail lorsqu’il y a de la pizza succulente à la brasserie du coin ;-) ) que je voulais exécuter une fois par semaine ; j’ai donc créé une tâche planifiée (un « cron job ») en créant un lien symbolique vers mon script dans le répertoire « /etc/cron.weekly », jusque là tout va bien sauf qu’au bout de quelques semaines je n’avais toujours rien reçu !

Aujourd’hui, je décide donc d’aller jeter un œil dans les logs sans y trouver de traces d’exécution de mon script alors que ses petits copains dans le répertoire étaient eux, bien exécutés !

Que diable se passe t-il ? Pour le savoir, il faut chercher la manière dont sont lancées ces tâches planifiées. Un petit tour dans le fichier « /etc/crontab » nous montre ceci :

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Nous voyons donc que les tâches sont exécutées grâce à la commande « run-parts ». Intéressons-nous au manuel de cette commande : « man run-parts ».

run-parts exécute tous les fichiers exécutables situés dans répertoire, et dont le nom satisfait les contraintes décrites ci-dessous. Les autres fichiers sont ignorés.

Si ni l’option –lsbsysinit ni l’option –regex n’est pas utilisée, alors les noms ne doivent être constitués que de lettres minuscules ou majuscules, de chiffres, de tirets de soulignement (« underscore ») ou de tirets.

Le problème apparaît alors clairement : notre lien symbolique, reprenant le nom du script, contient un point et n’est donc pas exécuté !

Deux solutions s’offrent alors à nous pour résoudre ce problème :

  • ajouter l’option « –lsbsysinit » à « run-parts » pour les 4 lignes présentes dans « /etc/crontab »
  • renommer le lien symbolique « bonne_bouffe.sh » en « bonne_bouffe »

Personnellement, j’ai choisi la seconde solution afin de coller à la façon de faire de Debian ;-)


mai 06 2008

Se balader efficacement dans les répertoires avec Bash

Tag: Debian GNU/Linux, SystèmeSylvain @ 17:55

Se balader dans les répertoires à partir d’un shell peut vite devenir fastidieux si l’on ne connaît pas quelques raccourcis, en voici quelques-uns qui vous ferons gagner du temps.

Tout d’abord, commençons par un petit rappel pour les plus néophytes d’entre nous : le changement de répertoire. Nous avons ici, respectivement, l’entrée dans le répertoire « test » puis le retour au répertoire parent grâce aux « .. » :

user@gnusquad:~$ cd test
user@gnusquad:~/test: cd ..
user@gnusquad:~$

La base étant rappelée, passons aux astuces plus intéressantes.
Le retour au répertoire utilisateur peut se faire de maintes façons, je vous laisse choisir la plus rapide ;-) :

user@gnusquad:~/test$ cd
user@gnusquad:~$
user@gnusquad:~/test$ cd ~
user@gnusquad:~$
user@gnusquad:~/test$ cd $HOME
user@gnusquad:~$

Comme vous venez de le voir, « ~ » correspond au répertoire personnel de l’utilisateur en cours (en anglais : sa « homedir») ; par extension nous pouvons suffixer ce « ~ » par le login de n’importe quel utilisateur pour atterrir directement dans son répertoire personnel (pour information : cette donnée se trouve, par défaut, dans le 6ème champ du fichier « /etc/passwd ») :

user@gnusquad:~$ cd ~www-data
user@gnusquad:/var/www$
user@gnusquad:~$ cd ~www-data/blog
user@gnusquad:/var/www/blog$

Imaginons maintenant que nous souhaitions revenir dans le répertoire précédent, deux possibilités s’offrent à nous : une, extrêmement simple et rapide et une autre, plus longue, qui à vrai dire, n’est là que pour vous signaler l’existence de la variable « OLDPWD » qui peut être utile lors de l’écriture d’un script :

user@gnusquad:~$ cd /var/www
user@gnusquad:/var/www$ cd -
user@gnusquad:~$
user@gnusquad:~$ cd /var/www
user@gnusquad:/var/www$ cd $OLDPWD
user@gnusquad:~$

Lorsque vous jonglez avec différents répertoires, il peut être pratique de les assigner à des variables pour ne pas devoir les taper systématiquement. Notez que vous pouvez très bien les utiliser en tant qu’arguments (exemple sur le billet « Modifier le contenu d’une révision dans un référentiel Subversion ») :

user@gnusquad:~$ WWW=/var/www
user@gnusquad:~$ SVN=/var/local/lib/svn/blog
user@gnusquad:~$ cd $WWW
user@gnusquad:/var/www$ cd $SVN
user@gnusquad:/var/local/lib/svn/blog$

Pour récupérer le chemin du répertoire courant dans une variable, on utilisera la commande « pwd » dans un sous-shell « $(xxx) ou `xxx` » :

user@gnusquad:/var/local/lib/svn/blog$ BLOG=$(pwd)
user@gnusquad:/var/local/lib/svn/blog$ BLOG=`pwd`

Une dernière astuce pour clôturer ce billet est l’utilisation d’un nouveau shell ce qui permet d’effectuer tout un tas d’opérations puis de retourner instantanément dans le répertoire précédent en appuyant simplement sur CTRL+D (commande « logout ») :

user@gnusquad:~$ bash
user@gnusquad:~$ cd /var/log/
user@gnusquad:/var/log$ ...
user@gnusquad:/var/log$ ^D (CTRL+D)
user@gnusquad:~$

À titre d’information, il existe 3 commandes dédiées aux répertoires que je n’ai pas présenté parce qu’à mon sens, pas très pratiques. Je vous laisse consulter le manuel de « Bash » pour avoir l’aide des fonctions suivantes : « pushd », « popd » et « dirs ».


mai 02 2008

Récupérer de l’espace disque sur une partition ext3

Tag: Debian GNU/Linux, SystèmeSylvain @ 16:12

Par défaut, 5% d’espace disque sont réservés pour l’utilisateur root lors du formatage d’une partition en ext3. Cet espace permet, d’une part, de minimiser la fragmentation des fichiers et d’autre part, de permettre aux processus tournant sous l’utilisateur root de continuer à fonctionner (ex : syslogd).

Il est possible de réduire cet espace grâce à la commande tune2fs.

Affichons tout d’abord l’espace libre disponible sur la partition /dev/mapper/vg0-lvhome où il nous reste 91 Go :

root@gnusquad:~# df -h /dev/mapper/vg0-lvhome
Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur /dev/mapper/vg0-lvhome
                      148G   50G   91G  36%  /home

Réduisons l’espace réservé à 1% du disque :

root@gnusquad:~# tune2fs -m 1 /dev/mapper/vg0-lvhome
tune2fs 1.40.8 (13-Mar-2008)
Initialisation du pourcentage de blocs réservés à 1% (393216 blocs)

Ré-affichons maintenant l’espace libre disponible sur la partition /dev/mapper/vg0-lvhome, nous venons de récupérer 6 Go :

root@gnusquad:~# df -h /dev/mapper/vg0-lvhome
Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur /dev/mapper/vg0-lvhome
                      148G   50G   97G  35%  /home

mai 01 2008

Ajouter des polices de caractères sous GNU/Linux

Tag: Debian GNU/Linux, X WindowSylvain @ 18:19

L’opération peut se faire aisément grâce aux interfaces graphiques disponibles dans KDE, Gnome et consors mais en ligne de commande, comment fait-on ?

C’est très simple : si vous souhaitez partager vos nouvelles polices de caractères pour tous les utilisateurs, copiez les dans le répertoire « /usr/share/fonts/truetype/ » en tant que root puis mettez à jour le cache avec la commande fc-cache :

root@gnusquad:~# cp newfont.ttf /usr/share/fonts/truetype/
root@gnusquad:~# fc-cache -fv

Si vous souhaitez rendre disponible ces nouvelles polices uniquement pour un utilisateur donné, copiez les dans le répertoire « ~/.fonts » (créer le s’il n’existe pas) :

user@gnusquad:~$ mkdir .fonts
user@gnusquad:~$ cp newfont.ttf .fonts/
user@gnusquad:~$ fc-cache -fv

« Page précédente