Comment automatiser une tâche avec CRON en utilisant Vim

Vi - Vi.... Improved (amélioré)
Logo Vim, qui signifie vi-improved (amélioré)

Deux tâches vraiment essentielles qu’on fait en administrant une machine sous Linux sont très souvent de modifier/créer un fichier et de planifier des tâches de maintenance.

Pour utiliser «cron» il faut savoir utiliser «vi», les commandes sont très souvent les mêmes. Je dois spécifier que j’ai basé mon tutoriel sur CRON fourni par Ubuntu Linux qui est (de mémoire) le même paquet que celui fourni dans Red Hat LinuxDebian Linux ou Ubuntu Linux.

Le but de ce billet est en fait de vous montrer sommairement comment automatiser une tâche (une commande) avec cron.

Je publierai plus tard un billet sur les différences entre les distributions de cron.

Utiliser vi (prérequis)

Vi est un éditeur de texte en ligne de commande qui permet de faire bien des macros, il peut sembler compliquer mais l’essentiel se résume ainsi.

  • ESCAPE permet d’entrer une commande
  • i mode Insertion
  • r mode remplacer le caractère courrant
  • SHIFT+a insérer a partir de la fin de la ligne courrante
  • : entrer une commande spéciale
  • :wq sauvegarder le fichier et quitter l’éditeur
  • :w sauvegarder le fichier courrant
  • :10 sauter a la 10e ligne du document
  • /text Chercher ‘text’ dans le document courrant
  • n Chercher le prochain mon cherché (par rapport a ce qui a été dit ci-haut)
  • dd supprimer la ligne courrante
  • 5dd supprimer les 5 prochaines lignes

source: Guide de survie VI

Créer une tâche CRON

Pour créer une tâche sur un système Linux il y a plusieurs méthodes possibles.

  1. Ajouter une ligne dans le «crontab», la table d’actions CRON
  2. Ajouter fichier avec directives dans /etc/cron.d/
  3. Ajouter une ligne dans un des dossiers /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly

1. Ajouter une ligne dans le «crontab», la table d’actions CRON

C’est fait soit en utilisant la commande crontab, ou en éditant le fichier /etc/crontab

crontab roule tout le temps en tant que root, et l’idéal serait d’utiliser un fichier dans /etc/cron.d/
Savoir sur quel usager doit rouler la tâche (un user local qui peut rouler la commande, idéalement pas root!)

  • [email protected]:~$ crontab -e
  • l’éditeur vi va s’ouvrir
  • aller a l’endroit ou vous voulez éditer
  • créez une nouvelle ligne en Insert mode, en utilisant le i, ou a la fin de la ligne courrante en faisant CTRL+a
  • Entrer une ligne dans le format
    * * * * * commande a être exécutée
    - - - - -
    | | | | |
    | | | | +----- jour de la semaine (0 - 6) (Dimanche=0)
    | | | +------- mois (1 - 12)
    | | +--------- jour dans le mois (1 - 31)
    | +----------- heure (0 - 23)
    +------------- min (0 - 59)

    exemple:

    30 18 * * * rm /home/someuser/tmp/*  > /home/someuser/cronlogs/clean_tmp_dir.log
  • … qui effacera le contenu de /home/someuser/tmp/ a tout les 18h30 de tout les jours et qui log dans /home/someuser/cronlogs/clean_tmp_dir.log
  • Pour quitter faites ESCAPE :wq pour write quit.

source: Crontab Quick reference

2. Ajouter fichier avec directives dans /etc/cron.d/

C’est le même principe sauf qu’il s’agit d’un fichier nommé, généralement sous le même nom que le package Linux qu’il dessert. Exemple php5 aurait son package.

Sauf qu’on peut spécifier qui lancera la commande.

Comment faire…

  • Créer un fichier, ex:
    # vi /etc/cron.d/php5
  • Coller la commande qui a été testée au par avant
    [email protected]:~$ rm /home/someuser/tmp/* > /home/someuser/cronlogs/clean_tmp_dir.log
  • Ajouter une ligne, ESCAPE+i
  • Commencer par le moment de l’exécution comme avec «Ajouter une ligne dans le crontab»
  • 30 19  *  *  *
  • Ajouter le nom du username qui va rouler la commande
  • ex: someuser
  • Ajouter la commande testée tout a l’heure
    ex: rm /home/someuser/tmp/* > /home/someuser/cronlogs/clean_tmp_dir.log
  • Ce qui donnera:
    30 19 * * * someuser rm /home/someuser/tmp/* > /home/someuser/cronlogs/clean_tmp_dir.log
  • Voilà!

3. Ajouter une ligne dans un des dossiers /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.monthly

Même concept que le crontab sauf que l’on a pas a mentionner quand exécuter, c’est /etc/crontab qui dit qand les fichiers sont exécuté

Sources