Articles plus anciens


J’ai un petit soucis de mémoire, je peux retenir/apprendre des choses très rapidement, mais aussi les oublier très rapidement et en ce qui concerne la vie courante c’est encore pire.


Il m’est arrivé plusieurs fois d’oublier (ou presque) des anniversaires ou des fêtes de mes proches (honte sur moi).


Pour palier à ma défaillance (humaine) j’ai donc cherché un moyen technique, sous la forme d’un programme m’avertissant (par mail) des anniversaires et autres rappels.


Mon choix s’est porté sur Remind qui est un outil en ligne de commande qui peut donc être installé sur mon serveur (sweetBox).


Installation

La solution la plus simple consiste à faire :

sudo aptitude install remind


Cependant avec cet installation vous aurez Remind en anglais (ce qui n’ai pas un problème en soi), si vous êtres joueur ou que vous voulez absolument Remind en français il va falloir le recompiler, en effet le paramétrage de la langue se fait à la compilation (pas top)


Installation à partir des sources (en FR)

On télécharge et décompresse les sources :

wget  http://www.roaringpenguin.com/files/download/remind-03.01.07.tar.gz
tar -xvf remind-03.01.07.tar.gz


Tant qu’on y est on peut éditer le fichier de configuration src/custom.h, pour ajouter sa position géographique (utile si vous faite des rappels en rapport avec les heures de levé couché du soleil) :

#define LAT_DEG 47
#define LAT_MIN 13
#define LAT_SEC  5
#define LON_DEG  1
#define LON_MIN 33
#define LON_SEC 10
#define LOCATION "Nantes"
#define DATESEP '/'


Rque : pour trouver ces coordonnées je suis allé sur Wikipédia


On compile puis on installe le programme (à noter le passage de la langue lors du make) :

./configure
make "LANGDEF=-DLANG=FRENCH"
sudo make install


Création des fichiers de rappel

Je ne vais pas rentrer ici en détail dans la syntaxe Remind, les possibilités sont énormes et je penses que l’on peut y passer pas mal de temps avant de la maitriser.


Remind se paramètre via un/des fichiers de configuration passé en paramètre.

Rque : si vous utilisez la commande rem en lieu et place de remind il essaiera de trouver un fichier .reminders dans le home de votre utilisateur.


Simplement un rappel à la syntaxe suivante :

REM [mois abrégé] [jour] MSG [texte libre]


Par exemple :

REM Mar 27 MSG Anniversaire du blog


Le mois abrégé est en anglais ou en français si vous avez compilé le programme en français, mais même dans ce cas il est conseillé d’utiliser l’abréviation anglaise (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)


En lisant les divers tutoriels (référencés en fin d’article) et le man vous pourrez voir qu’il existe des tonnes de possibilités de rappel cyclique (tous les lundi, tous les 2ème mardi du mois), d’omission/exception (faire un rappel à une date donnée sauf si c’est un jour férié), de formule de calcul, etc.


Pour mon cas personnel (rappel pour les anniversaires et fêtes) j’utilise les « astuces » suivantes :

Formule de calcul qui permet de calculer un age en fonction de l’année de naissance :

FSET _yr_num(yr)         YEAR(TRIGDATE()) - yr


Dès lors tous mes rappels d’anniversaire se font ainsi :

REM Mar 27 MSG Anniversaire de ce blog ([_yr_num(2009)] ans)


Ce qui donnera le 27 mars prochain :

Anniversaire de ce blog (1 ans)



Rappel pour la fête des mères :

La fête des mère à lieu en France le dernier dimanche de mai, sauf si elle coïncide avec le jour de la Pentecôte. Dans ce cas, elle a lieu le premier dimanche de juin. (Source Wikipédia), ce qui donne avec Remind :

REM SUN 1 Jun --7 OMIT MON TUE WED THU FRI SAT AFTER MSG Fête des mères


On voit ici la puissance de l’outil, j’avoue ce n’est pas moi qui ait créé ce rappel (je ne le comprend même pas) mais je l’ai trouvé sur ce thread.



Rappel pour la fête des pères :

REM SUN Jun 15 MSG Fête des pères



Tester

Pour exécuter Remind de l’appeler avec le nom/chemin du fichier de configuration :

remind remindTest.txt


Ou si vous avez créé un fichier de configuration .reminders sous votre home, il existe un alias :

rem


Pour tester une date donnée, il suffit de l’ajouter à la ligne de commande au format AAAA-MM-JJ

remind remindTest.txt 2010-05-30


Enfin il est possible de voir tous la prochaine date de déclenchement de chacun des rappels :

remind -n remindTest.txt



Rediriger la sortie de Remind vers un mail

Remind à une option qui permet d’envoyer son résultat vers une commande définie

Cette option est le -k et on fait référence au résultat de Remind avec le pattern %s.

remind -k'echo %s | mail -s "Pense-bete" adresse@email.fr' remindTest.txt


Remind appelle la commande echo en lui faisant afficher le résultat (%s), la sortie de la commande echo est redirigé via le pipe vers la commande mail classique…

Remind lorsqu’il est appelé avec l’option -k échappe avec des \ tous les caractères spéciaux contenu dans %s, il n’est donc pas nécessaire de mettre %s entre quote/guillemet



Planification

J’ai planifié Remind afin qu’il s’exécute tous les jours durant la nuit (avec mes autres job) et au boot de l’ordinateur si jamais celui-ci n’était pas allumé la nuit

J’ai réalisé ceci avec une planification Cron/Anacron (voir Planificateurs de tâches Cron et Anacron et leurs interactions)


Création d’un script remind.sh :

#! /bin/bash
 
. $HOME/.profile
cd $(dirname "${0}")
 
remind -k'echo %s | mail -s "Pense-bete" adresse@email.fr' remindAnniversaires.txt



Création d’une entrée anacron dans /etc/anacrontab :

1       0       remind           /home/mon_user/bin/remind.sh


Création d’une entrée Cron dans la crontab de mon utilisateur, appelant le script puis anacron avec le paramètre -u pour qu’il mette a jour sont timestamp sans exécuter la tache

30 0  *  *  *       /home/svc/bin/remind.sh ; anacron -u remind



Sources :

Remind | Roaring Penguin : Le site du projet

Remind: The Ultimate Personal Calendar : Article généraliste survolant les possibilité de Remind, les interfaces graphiques qu’il est possible d’y adjoindre et les sorties (papier)

[Remind-Fans] Mother’s day in France : Thread où j’ai trouvé la formule pour la fête des mères

remind-oclug.pdf (Objet application/pdf) : Présentation très intéressante sur Remind


Remind – 43FoldersWiki : Pages Remind du Wiki du site de productivité 43Folders

Dont les pages suivantes :

User:JamesRifkin/defs.rem – 43FoldersWiki : Définition de constantes, de date de vacances, etc, bref à creuser

Remind FAQ – 43FoldersWiki : FAQ Remind, des trucs et astuces…


Guest: Mike Harris looks at « Remind » | 43 Folders : Article correspondant sur le site 43folders

Linux.com :: Manage your time with Remind

Geek to Live: Keep your calendar in plain text with Remind – Cygwin – Lifehacker : un article sur Lifehacker

$ cat blog: remind en français (Debian Etch) : un rare article en français avec un package remind pour debian etch (vieille version)

Remind + Ubuntu + Gmessage : Remind sous Gnome (popup)

HOWTO: One remind to rule them all [Archive] – Ubuntu Forums : le temoingnage d’un utilisateur de Remind (je lui ai piqué sa fonction pour calculer les ages)

remind – remind syntax : vim online : La coloration syntaxique de remind sous vim


Autres reminders :

The BDAY Handbook: Introduction

pal calendar

GBirthday : client graphique se basant sur evolution

Email-Reminder


Image par Balakov sous CC BY-NC : fleur de myosotis appelé forget-me-not en anglais

J’envisage prochainement de changer de PC de bureau (en Avril/Mai pour réinstaller avec Lucid Lynx).

Je vais monter mon PC moi-même, il me faut donc choisir tous les composants, mais comment faire ce choix ?


Mon premier critère sera le prix, je ne tiens pas à dépenser beaucoup dans cette machine (ni dans aucune autre), de plus compte compte tenu de son usage (bureautique/internet), je n’ai pas besoin d’une bête de course.

Ensuite à prix quasi équivalent comment choisir entre 2 CPU par exemple ?


Pour cela je me suis mis en quête de site de benchmark pour comparer les produits entre eux, en voici le résultat :


Cartes graphiques :

TechArp : donnes les caractéristiques technique de nombreuse, reste ensuite à interpréter ces valeurs…

PassMark : ici des benchmarks avec indice de performance et graphique permettant de comparer aisément 2 produits


CPU :

TechArp : idem des caractéristiques à comparer/analyser. A noter qu’il existe d’autre guide sur le site pour les CPU de serveurs, de portables, etc (faire une recherche sur le site)

TechArp comparaison des caractéristiques des processeur Core 2

La page correspondante sur PassMark

Une page comparant les temps de traitement de rendus 3D avec le logiciel fryrender (basé sur les remontés utilisateurs). Donne une idée de la performance du couple CPU / RAM

Comparaison des CPU mobiles


Disques durs :

TechArp : idem des caractéristiques à comparer/analyser

La page correspondante sur PassMark



Remarque :

Pour le choix de ma CPU je me baserai aussi sur ses capacités de virtualisation en étudiant cette page d’Intel


Sources :

Google

Comparing CPU Speed and Performance from Benchmarks Reports


Si vous avez un administrateur réseau qui en veut à Firefox et qui bloque l’accès à internet à ce dernier via un proxy (Isa par exemple), j’ai décris dans cet article comment passer outre en changeant le useragent de Firefox pour le déguiser en Internet Explorer via l’extension user agent switcher.


Cependant cela devient fastidieux de changer la useragent à chaque re-démarrage de Firefox, voici comment rendre ce changement définitif et ne plus avoir besoin de l’extension


Pour cela il faut créer un fichier all.js dans le répertoire [Repertoire installation Firefox]\defaults\pref et y ajouter la ligne suivante :

pref( "general.useragent.override", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)" );


Rque : Testé sous Firefox 3.6


Edit :

26/03/2010 : L’ajout de cette préférence dnas le fichier [Repertoire installation Firefox]\defaults\pref\firefox.js comme initialement indiqué dans cet article marche aussi, mais la manipulation sera supprimé à chaque installation d’une nouvelle version de Firefox

Si Opéra n’est pas bloqué par le proxy, il vaut mieux utiliser le useragent de ce dernier. Il y aura moins de site d’incompatible.

pref( "general.useragent.override", "Opera/9.25 (Windows NT 6.0; U; en)" );


Sources :

Photo par The Rocketeer sous CC BY-NC-ND

http://www.ericgiguere.com/articles/masquerading-your-browser.html

https://developer.mozilla.org/En/A_Brief_Guide_to_Mozilla_Preferences

Si vous essayez d’exécuter anacron en tant qu’utilisateur de base (pas root et sans sudo), cela échouera car anacron veut écrire son fichier de « log » dans le répertoire /var/spool/anacron (voir Planificateurs de tâches Cron et Anacron et leurs interactions) qui appartient a root avec des droits 755.


La solution est de créer un groupe spécifique, d’ajouter l’utilisateur voulu à ce groupe et de changer les droits sur /var/spool/anacron :

sudo groupadd anacron
sudo adduser svc anacron
sudo chown root:anacron /var/spool/anacron/
sudo chmod 755 /var/spool/anacron/


Source :

http://www.it.uc3m.es/marcos/doc/miniHOWTOs/miniHOWTO-Use_anacron_as_non-root_user.html

La planification de tache consiste à mettre en œuvre des solutions visant à exécuter automatiquement des scripts, des commandes ou des logiciels à une date et une heure spécifiées à l’avance, ou selon un cycle défini à l’avance.


Cron est un démon utilisé pour programmer des tâches devant être exécutées à un moment précis (source)

Anacron est un programme utilisé pour planifier des tâches à interval régulier sans notion de moment (heure, date)


Sans rentrer dans les détails je vais décrire les programmes cron et anacron et leur configurations (vous trouverez plus précis/complet sur d’autre site), puis je vais me concentrer sur les interaction entre ces 2 programmes.


Cron

Cron est un démon (programme toujours lancée) qui s’appui sur des fichiers de configuration nommés crontab pour déterminer quels programmes/script exécuter à quelle date/heure.


Syntaxe Crontab

Chaque utilisateur possède potentiellement un crontab, ils se situent sous /var/spool/cron/crontabs/[user] et ont la structure suivante :

Les # sont des commentaires, je copie toujours ces lignes de commentaire suivante dans mes crontab, rappelant ainsi la structure du fichier.


##########################################################
#minute (0-59),                                          #
#|  heure (0-23),                                        #
#|  |  jour du mois (1-31),                              #
#|  |  |  mois de l'année (1-12),                        #
#|  |  |  |  jour de la semaine (0-6 with 0=Dimanche)    #
#|  |  |  |  |       commandes                           #
##########################################################
0  1  *  *  *       /home/user/bin/sauvegarde.sh
0 */3 *  *  *       /home/user/bin/downloadSerie.sh


On a donc 6 zones séparé par des espaces (ou des tabulations).

Les 5 premières servent à spécifier le moment de l’exécution du programme/script qui est indiqué en zone 6;


Ces 5 zones peuvent prendre

  • une valeur fixe : 0 à 59 pour les minutes, 0 à 23 pour les heures, 1 à 12 pour les mois et 0 à 6 pour les jours
  • une plage de valeurs : 0-6 dans la zone des heures indique de lancer la tache à minuit, 1h, 2h … et 6h du matin
  • une liste de valeurs : 0,15,30,45 dans la zone des minute indique de lancer la tache à l’heure + 0 minute (= HH:00), HH:15, HH:30 et HH:45
  • un pas : */15 dans la zone des minute indique de lancer la tache toutes les 15 minutes, ce qui ne coïncidera pas forcement avec les même heure que précédemment. En effet en fonction du l’heure de démarrage du PC et donc l’heure de démarrage du Cron on pourra avoir par exemple HH:07, HH:21, HH:37, HH:52, HH+1:07, etc.


Il existe d’autre syntaxe plus compliqué, on peut combiner les différentes syntaxe mais personnellement je n’en ai jamais eu besoin, voir la page du wiki Mandriva


Edition Crontab

Pour éditer la crontab, il ne faut pas aller éditer le fichier dans /var/spool/cron/crontabs/, mais il faut utiliser la commande :

crontab -e


Rque :

Autres commandes :

crontab -l        # affichage
crontab -r        # suppression


Crontab pour le système

Le système Linux lui-même utilise la planification Cron, ces tâches sont définis dans des Crontabs particulière

  • fichier /etc/crontab
  • fichiers présents sous /etc/cron.d


Ces crontabs ont une zone supplémentaire (en position 6) qui permet de spécifier le user qui doit lancer le script.

17 * * * *	root cd / && run-parts --report /etc/cron.hourly
 

On verra le contenu par défaut de /etc/crontab dans le chapitre « Interaction Cron/Anacron ».

 

 

Anacron

Anacron est un programme « standard » (c’est pas un démon/service), il est lancé :

  • au démarrage du système via un script d’init (/etc/init.d/anacron)
  • via le crontab système, on verra ce dernier point lors de la description des interaction cron/anacron


Anacron lorsqu’il s’exécute vérifie les taches qu’il à de paramétré, lance celles qui doivent l’être puis s’arrête. Anacron n’est pas un programme résident en mémoire.


Anacron n’est pas installé par défaut (tout du moins sous Ubuntu 9.04), pour ce faire on fera un :

 sudo aptitude install anacron


Syntaxe Anacrontab

Anacron se configure via un fichier anacrontab (/etc/anacrontab) qui a le format suivant :

##########################################################
#périodicité (jours),                                    #
#|  délai (minutes),                                     #
#|  |  nom de la tache,                                  #
#|  |  |          commandes                              #
##########################################################
 1  5  remind     remind anniversaire.txt


Dans l’exemple ci-dessus la commande remind (dont je parlerais plus tard) sera exécutée tous les jours 5 minutes après le démarrage d’anacron.


Si la machine reboot plusieurs fois dans la journée, anacron est exécuté plusieurs fois, afin de ne pas lancer une tache quotidienne à chaque reboot anacron stock la date (format AAAAMMJJ) de sa dernière exécution dans un fichier de « log » portant le nom de la tache et présent dans /var/spool/anacron.

Lorsqu’il parcours les taches qui lui sont affecté, anacron vient donc lire le fichier de « log » correspondant, compare la date du jour, la date de dernière exécution et l’intervalle de la tache et la lance le cas échéant.



Interactions Cron/Anacron

Cron et Anacron sont complémentaires, cron appelle anacron et anacron exécute des taches cron.


Anacron appelle les taches Cron

Sous Ubuntu (9.04), par défaut la crontab système contient ceci que anacron soit installé ou  non.

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 )


Le double pipe (||) est un ou logique ainsi si la première commande echoue, la seconde sera exécuté sinon elle ne le sera pas.

Pour le tester vous pouvez essayer ceci :

test -x /usr/bin/wget || echo "le programme wget n'existe pas"
test -x /usr/bin/toto || echo "le programme toto n'existe pas"


run-parts permet d’exécuter tous les scripts présent dans le répertoire passé en paramètre (ici les différents répertoire cron.xxx)


Les scripts présents dans /etc/cron.hourly sont donc exécuté toutes les heures à la 17ème minute, les scripts quotidiens, hebdomadaires et mensuels sont exécutés respectivement à 6h25 (tous les jours), 6h47 (le dimanche) et 6h52 (le 1er du mois) SAUF si anacron est installé.

Auquel cas ce sera anacron qui se chargera de les exécuter, nous allons voir comment.


L’anacrontab sous Ubuntu 9.04 contient par défaut :

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# These replace cron's entries
1       5       cron.daily       nice run-parts --report /etc/cron.daily
7       10      cron.weekly      nice run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly nice run-parts --report /etc/cron.monthly


On voit ici qu’anacron se charge bien d’exécuter les scripts « Cron » présents dans /etc/cron.daily, /etc/cron.weekly et /etc/cron.monthly respectivement tous les jours, tous les 7 jours et mensuellement.


Cron lance Anacron

Sous Ubuntu 9.04 Anacron lance les taches Cron (sauf les hourly) mais qui lance Anacron.

On a vue qu’Anacron s’exécutait au démarrage du système  mais comment cela se passe-t-il si le système ne reboot pas ?

Réponse : Anacron est alors lancé par Cron via un crontab système /etc/cron.d/anacron qui contient :

# /etc/cron.d/anacron: crontab entries for the anacron package
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
30 7    * * *   root    test -x /etc/init.d/anacron && /usr/sbin/invoke-rc.d anacron start >/dev/null


Tous les jours à 7h30 Cron vérifie que le script d’initialisation anacron existe et si oui (&& = et logique) le démarre.


Les scripts daily sont donc exécuté à 7h35 (démarrage d’anacron à 7h30 mais il attend 5 minutes), les weekly à 7h40 et les monthly à 7h45, sauf si le PC boot/reboot avant cette heure.


Ceinture et bretelles

Afin d’éviter qu’un script daily/weekly/monthly exécuté par Cron ne le soit de nouveau par Anacron, il y a dans chaque répertoire /etc/cron.xxxx un script nommée 0anacron.

Commençant par zéro ce script est exécuté avant tous les autres du répertoire (par run-parts).

Elle contient ceci :

#!/bin/sh
# anacron's cron script
# This script updates anacron time stamps. It is called through run-parts
# either by anacron itself or by cron.
# The script is called "0anacron" to assure that it will be executed
# _before_ all other scripts.
test -x /usr/sbin/anacron || exit 0
anacron -u cron.daily


Ce script (si anacron est installé) lance anacron pour la tache donnée (daily/weekly/monthly) mais avec le paramètre -u qui fait qu’anacron inscrit la date de dernière exécution dans le fichier de « log » correspondant mais n’exécute pas la tache.


Je penses que ce script n’a raison d’être qu’en de très rare cas (d’où mon titre de chapitre), en effet les scripts daily/weekly/monthly ne sont exécutés  que par anacron dès lors que ce dernier est installé, or anacron positionne son flag de dernière exécution dès la fin du job.


Plannifier une tache par Cron en priorité puis par Anacron

Venons en au cas qui m’a fait m’intéresser à Cron et Anacron.

Je veux pouvoir planifier un script par Cron en priorité par exemple pour qu’il s’exécute pendant la nuit à une heure précise, mais je veux qu’Anacron prenne le relai si jamais le PC n’était pas allumé à l’heure dite.

En gros je veux faire l’inverse de ce que fait Ubuntu qui donne la priorité à Anacron.


Voici la solution trouvée :

Dans la crontab de mon utilisateur, j’indique l’heure d’exécution de mon script et j’exécute anacron avec l’option -u pour que le script ne soit pas ré-exécuté para anacron lors d’un reboot dans la même journée ou à 7h30 (heure de déclenchement d’anacron par cron) :

##########################################################
#minute (0-59),                                          #
#|  heure (0-23),                                        #
#|  |  jour du mois (1-31),                              #
#|  |  |  mois de l'année (1-12),                        #
#|  |  |  |  jour de la semaine (0-6 with 0=Dimanche)    #
#|  |  |  |  |       commandes                           #
##########################################################
0  1  *  *  *       /home/user/bin/remind.sh ; anacron -u remind


Dans l’anacrontab je crée la tache correspondante :

##########################################################
#périodicité (jours),                                    #
#|  délai (minutes),                                     #
#|  |  nom de la tache,                                  #
#|  |  |          commandes                              #
##########################################################
 1  5  remind     remind anniversaire.txt


Et voila….



Sources :

Image par mararie sous CC BY-SA

Planifier des tâches pour l’ordinateur : excellent article du wiki mandriva sur cron / anacron et at (planification ponctuelle)

http://doc.ubuntu-fr.org/cron : le wiki Ubuntu pour Cron

http://doc.ubuntu-fr.org/anacron : le wiki Ubuntu pour Anacron

http://www.tuxradar.com/content/automate-linux-cron-and-anacron : utilisation de cron et anacron conjointe

Cron and Anacron – Linux Scheduling Utility

Mémo Crontab