Outils pour utilisateurs

Outils du site


issue70:tutoriel_cron

Table des matières

1

This is very easy to set up – although, later, I shall use a slightly complicated example to illustrate its use. If you have several users configured on your machine, each user gets their own independent schedule which they can configure. Experienced users will recognise this as a description of Cron, pre-installed on virtually all Linux machines. The use of cron by root is somewhat different, and is used by some system functions – so we shall ignore the use of cron by root. Each user specifies their schedule via a “crontab” which can be listed or edited via the crontab command. We can list our crontab with the crontab -l command:

C'est très facile à mettre en place - même si, plus tard, je vais utiliser un exemple un peu compliqué pour en illustrer l'utilisation.

Si vous avez plusieurs utilisateurs configurés sur votre machine, chaque utilisateur a sa propre programmation indépendante qu'il peut configurer.

Les utilisateurs expérimentés reconnaîtront qu'il s'agit d'une description de cron, pré-installé sur pratiquement toutes les machines Linux. L'utilisation de cron par root est quelque peu différente, et est utilisée par certaines fonctions du système, nous allons donc l'ignorer.

Chaque utilisateur définit sa programmation via un « crontab » qui peut être affiché ou modifié via la commande crontab. Nous pouvons afficher notre crontab avec la commande crontab -l :

2

You will always find these descriptive comments in your crontab – and you should retain them. To customise your crontab you need to add one (or more) lines containing time information and a command (or script) to be run. Cron runs as a background daemon, and will run your command(s) at the appropriate times. Note: your commands will be run under your user privileges; it isn't possible to gain elevated privileges by using sudo, etc. There are 5 fields to specify the date – and the formats can be made quite complicated.

Vous trouverez toujours ces commentaires descriptifs dans votre crontab et vous devez les conserver. Pour personnaliser votre crontab, vous devez ajouter une (ou plusieurs) lignes contenant des informations d'horodatage et une commande (ou un script) à exécuter.

Cron est un démon qui tourne en tâche de fond et qui exécutera vos commandes au moment approprié.

Remarque : vos commandes seront exécutées avec vos privilèges d'utilisateur ; il n'est pas possible d'obtenir des privilèges élevés en utilisant sudo, etc.

Il y a 5 champs pour préciser la date, et les formats peuvent être rendus assez compliqués.

3

The separator between each of the five fields is always one or more spaces (or tab characters). Individual fields may contain complicated specifications such as 1-5,10-15 (but are usually either an asterisk or a single number). The hyphens and comma are not to be considered as field separators. Each one is typically a number of units. So, for example, 2,4,6 means run at 2 units, 4 units, and 6 units. Another variation is 2-5 which is the same as 2,3,4,5. If we want to run on every valid occasion, we should specify a *. Writing something like */10 means run once every 10 units (so */10 in the minutes field means run at 00,10,20,30,40,50 minutes past the hour). We may also use names in those fields where it makes sense. As if this wasn’t enough, combinations are allowed e.g: 1-3,7,9 is equivalent to: 1,2,3,7,9

Le séparateur entre chacun des cinq champs est toujours un ou plusieurs espaces (ou des tabulations). Chaque champ peut contenir des spécifications complexes telles que 1-5,10-15 (mais ce sont généralement soit un astérisque, soit un seul nombre). Les traits d'union et les virgules ne sont pas des séparateurs de champ.

Chacun est généralement un certain nombre d'unités. Ainsi par exemple 2,4,6 signifie une exécution à 2 unités, 4 unités et 6 unités. Une autre variante est 2-5, qui est la même chose que 2,3,4,5. Si nous voulons une exécution à chaque occasion valide, nous devons l'indiquer avec *. Écrire quelque chose comme */10 signifie une exécution une fois toutes les 10 unités (donc */10 dans le domaine des minutes signifie à 00,10,20,30,40,50 minutes après l'heure).

Nous pouvons également utiliser des noms dans les champs où cela a un sens.

Comme si cela ne suffisait pas, les combinaisons sont autorisées, par exemple: 1-3,7,9 est équivalent à : 1,2,3,7,9

4

1st field Minute of the hour (0 - 59) 2nd field Hour of the day (0 - 23) 3rd field Day of the month (1 – 31) 4th field Month of the year (1 – 12 or feb, jun, etc) 5th field Day of the week (0 – 7; both 0 and 7 mean Sunday, or names: mon, tue, wed, etc).

1er champ Minute de l'heure (0 - 59)

2e champ Heure de la journée (0 - 23)

3e champ Jour du mois (1 - 31)

4e champ Mois de l'année (1 - 12 ou feb, jun, etc.)

5e champ Jour de la semaine (0 - 7 ; 0 et 7 signifient tous les deux dimanche ; ou des noms: mon, tue, wed, etc.)

5

Examples First, a bad example – this would run only if 13th June is a Monday (next occurs in 2016)! 0 1 13 jun mon some-command More sensibly, 0 1 13 * * some-command This would run at 01:00 on the 13th of each month.

Exemples

Tout d'abord, un mauvais exemple - qui ne sera exécuté que si le 13 juin est un lundi (prochaine fois en 2016) !

0 1 13 jun mon une-commande

Plus raisonnablement,

0 1 13 * * une-commande

Cela s'exécutera à 01:00 le 13 de chaque mois.

6

Suppose you want to log problems with a very bad connection, using a user-written script named .whatip.sh which is a (hidden) file in the home directory, you might run the following: */10 * * * * [ -x .whatip.sh ] && bash .whatip.sh 2>/dev/null This runs every 10 minutes. The [ -x .whatip.sh ] command tests that the executable file exists, and only if this is true does the && permit running of the script (which writes to a log file); the 2>/dev/null causes any output to be ignored. Despite the wealth of possibilities in specifying the time a job is to be run, there are certain specifications which can't be easily specified, such as “run on the last day of the month”. For such cases a run specification of something like: 0 1 28-31 * * some-script would be suitable – with the script making an early exit if it isn't actually the very last day of the month.

Supposons que vous souhaitiez enregistrer dans les journaux (log) les problèmes avec une très mauvaise connexion, en utilisant un script écrit par l'utilisateur nommé .whatip.sh qui est un fichier (caché) dans le répertoire racine, vous pouvez exécuter la commande suivante :

*/10 * * * * [ -x .whatip.sh ] && bash .whatip.sh 2>/dev/null

Cela s'exécute toutes les 10 minutes. La commande [ -x .whatip.sh ] teste si le fichier exécutable existe et, seulement si c'est le cas, le && permet l'exécution du script (qui écrit dans un fichier de log) ; le 2>/dev/null permet d'ignorer tous les affichages écran.

Malgré la richesse des possibilités pour spécifier les heures auxquelles une commande doit être exécutée, il y a certaines spécifications qui ne peuvent pas être facilement indiquées, comme « exécuter le dernier jour du mois ». Pour de tels cas, une programmation d'exécution telle que :

0 1 28-31 * * un-script

serait appropriée, avec un script qui prévoit une sortie précoce si ce n'est pas réellement le dernier jour du mois.

7

Editing crontab: using the crontab -e command. This will almost certainly not use your normal editor, such as gedit, but a more basic one – such as nano. This is perfectly good for editing configuration files and works in a non-GUI environment. You still have keys such as insert, delete, backspace. Screen navigation (up, down, etc) is via cursor keys and page-up, page-down keys. However, you don't have scroll bars of any sort. The function keys are listed across the bottom – but you need only two of those listed. Scroll down to the last line and enter your changes to your crontab.

Modification du crontab : en utilisant la commande crontab -e.

Ceci n'utilisera sans doute pas votre éditeur normal, comme gedit, mais un plus basique, comme nano. C'est tout à fait suffisant pour éditer les fichiers de configuration et travailler dans un environnement non graphique.

Vous avez toujours des touches telles que Inser, Suppr, Retour arrière. La navigation (haut, bas, etc.) se fait via les touches fléchées ainsi que page précédente et page suivante. Cependant, vous n'avez pas de barres de défilement d'aucune sorte.

Les touches de fonction sont listées en bas, mais vous n'avez besoin que de deux d'entre elles.

Faites défiler jusqu'à la dernière ligne et saisissez vos modifications à votre crontab.

8

I understand that the very last line must end with a newline – this may not be necessary. Check, then press CTRL+O to write out your changes. Finally, press CTRL+X to exit. If you want to disable a crontab specification, comment it out by inserting a # in the first position. It's quite hard to come up with a crontab line which does useful work, without turning it into a script – but I do have a useful example (the credit for this belongs to an unknown author).

Je crois que la dernière ligne doit se terminer par un saut de ligne - cela peut ne pas être nécessaire.

Vérifiez, puis appuyez sur CTRL + O pour enregistrer vos modifications.

Enfin, appuyez sur CTRL + X pour quitter.

Si vous souhaitez désactiver une spécification de crontab, commentez-la en insérant un # en début de ligne.

Il est assez difficile de trouver une ligne de crontab qui fasse un travail utile, sans le transformer en un script, mais j'ai un bon exemple (le mérite en revient à un auteur inconnu).

9

First the problem: If you move a fair number of files around, then Nautilus will create a small thumbnail file for it. If you move the file, you get another thumbnail, and if you look at your system directories you will generate many thousands of thumbnails. The problem is that Nautilus never deletes thumbnails. To check if you have a problem, enter the following command: du -sbh .thumbnails I get a value of 20M i.e. 20MBytes (that's roughly 1,000 thumbnails). You might see a much larger value. The solution: Every day I run a cron job to delete thumbnails which were last accessed more than 7 days ago. The command part in the crontab is: find ~/.thumbnails -type f -atime +7 -exec rm '{}' \;

D'abord, le problème : si vous déplacez un bon nombre de fichiers, Nautilus va créer un petit fichier de vignettes pour eux. Si vous déplacez un fichier, vous obtenez une autre vignette, et si vous regardez vos répertoires système, vous allez générer plusieurs milliers de vignettes. Le problème est que Nautilus ne supprime jamais les vignettes.

Pour vérifier si vous avez un problème, entrez la commande suivante :

du -sbh .thumbnails

Je reçois une valeur de 20M soit 20 Mo (cela représente environ 1 000 vignettes). Vous pouvez voir une valeur beaucoup plus grande.

La solution : chaque jour, j'exécute une tâche cron pour supprimer les vignettes qui ont été consultées pour la dernière fois il y a plus de 7 jours. La commande dans la ligne crontab est :

find ~/.thumbnails -type f -atime +7 -exec rm '{}' \;

10

It is critical that the command is entered exactly as shown including the trailing \; Because this command includes the rm (remove file) command, you may like to test it first by running another closely associated (and harmless) command in a terminal window: find ~/.thumbnails -type f -atime +7 -exec ls '{}' \; | more Note the replacement of the rm command by the ls command. Once you are happy with the operation, you can enter a time specification and the command containing the rm operation into your crontab. Obviously you may want to change the value of +7 to suit your machine. My crontab entry reads: 45 19 * * * find ~/.thumbnails -type f -atime +7 -exec rm '{}' \; Or, each evening, at 19:45 remove excess thumbnails.

Il est essentiel que la commande soit entrée exactement comme indiqué, notamment le « \; » final.

Comme cette commande contient la commande rm (supprimer le fichier), vous pouvez avoir envie de la tester d'abord en exécutant une autre commande très proche (et inoffensive) dans une fenêtre de terminal :

find ~/.thumbnails -type f -atime +7 -exec ls '{}' \; | more

Remarquez le remplacement de la commande rm par la commande ls.

Une fois que vous êtes satisfait de l'opération, vous pouvez entrer une indication de l'heure et la commande contenant l'opération rm dans votre crontab. Évidemment, vous voudrez peut-être changer la valeur de +7 en fonction de votre machine. Mon entrée crontab est la suivante :

45 19 * * * find ~/.thumbnails -type f -atime +7 -exec rm '{}' \;

soit : chaque soir à 19h45 supprimer les vignettes en trop.

11

If you have multiple users, you will need to repeat for each one. Your crontab is actually stored in a sub-directory of the /var directory – so a system upgrade where you choose to replace all your system files (even if you retain your /home directory) will cause your crontabs to be lost. However, it is important that you edit your crontab only via the crontab command, as this incorporates some important error checking. Excursionary note If you have not performed an install which involved overwriting your /home directory in the last year or two, then the thumbnail removal entry may work slightly differently – but the difference is marginal and rather historical.

Si vous avez plusieurs utilisateurs, vous devrez répéter ceci pour chacun.

Votre crontab est en fait stocké dans un sous-répertoire du répertoire /var - donc une mise à niveau du système où vous choisissez de remplacer tous vos fichiers système (même si vous conservez votre répertoire /home) entraînera la perte de votre crontab. Cependant, il est important de modifier votre crontab seulement via la commande crontab, car elle contient une vérification d'erreur importante.

Remarque en passant

Si vous n'avez pas effectué une installation qui écrase votre répertoire /home depuis un an ou deux, la suppression des vignettes peut fonctionner un peu différemment - mais la différence est marginale et plutôt historique.

12

Originally, in addition to setting creation and modification timestamps on files, Linux always recorded file access timestamps (this is the -atime in our crontab entry). This can be inefficient, since reading a file always caused an additional write (to update the access timestamp). It is now possible to indicate that you don't want any atime updates to take place – and this is the current default. Note that frequently accessed directories would always be looked at more often than every 7 days and so (under the old scheme), their thumbnails would never be deleted. Under the new scheme, atime is never updated, and so even these thumbnails would be deleted and very quickly recreated every 7 days. It's not a noticeable problem for thumbnails – although I understand one or two older applications find the atime change to be a problem.

À l'origine, en plus de tracer l'horodatage de création et de modification sur les fichiers, Linux enregistrait toujours l'horodatage d'accès aux fichiers (c'est le -atime dans notre ligne crontab). Cela peut être inefficace, puisque la lecture d'un fichier provoquait toujours une écriture supplémentaire (pour mettre à jour l'horodatage d'accès). Il est maintenant possible d'indiquer que vous ne voulez pas de mises à jour atime, et c'est le réglage par défaut actuel.

Notez que les répertoires fréquemment utilisés seront toujours consultés plus souvent que tous les 7 jours et ainsi (avec l'ancien système), les vignettes ne seraient jamais supprimées. Avec le nouveau système, atime n'est jamais mis à jour ; ainsi, même ces vignettes seraient supprimées et très rapidement recréées tous les 7 jours. Ce n'est pas un problème perceptible pour les vignettes - même si je comprends qu'une ou deux applications anciennes trouvent que le changement du atime est un problème.

13

To check your setting enter: cat /etc/fstab | grep /home into a terminal screen; I get 2 lines displayed. # /home was on /dev/sda7 during installation UUID=0648d2d1-9a41-4257-8b79-dfc7bc227e82 /home ext3 defaults,noatime 0 2 (My /home is mounted as ext3 – yours is probably ext4). I have manually changed /etc/fstab to mount everything as noatime – which means no access timestamps are updated, just like the modern default. If you don't see noatime listed, or you see atime in its place, you should consider modifying your fstab file to use the noatime option unless there is a special reason not to.

Pour vérifier vos paramètres, saisissez :

cat /etc/fstab | grep /home

dans un écran de terminal ; ça m'affiche 2 lignes.

# /home was on /dev/sda7 during installation

UUID=0648d2d1-9a41-4257-8b79-dfc7bc227e82 /home ext3 defaults,noatime 0 2

(mon /home est monté en ext3 - le vôtre est probablement ext4).

J'ai changé manuellement le fichier /etc/fstab pour monter tout en noatime, ce qui signifie pas d'horodatage d'accès mis à jour, tout comme le réglage moderne. Si vous ne voyez pas noatime dans la liste, ou voyez atime à la place, vous devriez envisager de modifier votre fichier fstab pour utiliser l'option noatime, à moins qu'il n'y ait une raison particulière de ne pas le faire.

issue70/tutoriel_cron.txt · Dernière modification : 2013/05/26 14:24 de auntiee