GNU/Linux >> Tutoriels Linux >  >> Linux

Comprendre Crontab sous Linux avec des exemples

La crontab est utilisée pour automatiser tous les types de tâches sur les systèmes Linux. Il s'agit d'une compétence particulièrement importante à apprendre pour les aspirants administrateurs système. Il peut être un peu difficile de commencer si vous êtes débutant. La syntaxe est différente de la plupart des autres commandes. Pour cette raison, cette leçon comprendra un peu plus d'informations générales avant de vous montrer certaines des utilisations.

Ne soyez pas intimidé par crontab

Pour moi, Crontab était l'un des concepts Linux les plus intimidants en tant que débutant. Au moment où j'ai découvert "crontab", j'utilisais la ligne de commande depuis quelques jours seulement et je comprenais à peine comment utiliser les commandes de navigation de base dans les fichiers comme "ls" et "cd".

La raison pour laquelle j'évoque mon historique d'apprentissage personnel est que je m'attends à ce que de nombreux nouveaux utilisateurs de Linux se sentent également dépassés lorsqu'ils examinent la syntaxe unique de "crontab". Mais je peux vous rassurer, ce n'est pas si compliqué une fois qu'on a compris comment ça marche.

Ce que vous apprendrez dans ce guide

Je veux donner une introduction rapide à certains des concepts impliqués avec crontab pour le rendre plus facile à comprendre. Mon objectif est de contextualiser ces concepts et d'illustrer comment ils sont liés les uns aux autres.

  • Introduction rapide aux concepts de Cron
  • Configurer l'accès Crontab pour votre compte utilisateur
  • Gérez les erreurs avec vos cronjobs
  • Créer des tâches cron

Introduction rapide aux concepts clés de cron

Permettez-moi d'abord de vous présenter un concept de base autour de "cron".

Différence entre Cron, Crontab et Cron Job

Voir les choses visuellement aide à comprendre plus rapidement de nouveaux sujets. Voici une ventilation de la façon dont ces trois sujets interagissent généralement. Je décrirai ensuite chacun avec plus de détails.

Élément Nom Linux Signification
Démon ‘crond’ Prononcé "démon" ou "jour-mon". Ce sont des processus système Linux en arrière-plan.
Tableau ‘crontab’ Vous écrivez des lignes dans cette table lorsque vous entrez une commande crontab. Chaque astérisque "*" représente un segment de temps et une colonne correspondante dans chaque ligne.
Emploi Tâche Cron La tâche spécifique à effectuer décrite dans une ligne, associée à son identifiant de temps désigné

La table Cron

Crontab signifie Cron Table. Il s'agit d'un fichier système Linux qui crée une structure semblable à un tableau dans laquelle les champs sont séparés par des espaces blancs. Les utilisateurs peuvent remplir le tableau en attribuant des valeurs à chaque champ (astérisque).

Tout au long de l'article, je pourrais utiliser un langage différent pour décrire cette idée. Pour être clair, un champ, une cellule, une colonne, etc. font tous référence à la même chose. Si cela vous aide, vous pouvez considérer votre crontab comme une mini-base de données.

La tâche Cron

Si vous n'êtes pas familier avec les bases de données, vous pouvez imaginer les cellules dans un fichier Excel vierge. Dans tous les cas, pour cette analogie, chaque astérisque représente une colonne dont la signification est définie par son en-tête. La dernière colonne sera un appel à une commande ou un script. Chaque ligne complète peut être considérée comme une tâche individuelle. Celles-ci sont souvent appelées "tâches cron", bien que travail, tâche, etc. soient tous des termes interchangeables.

Le démon Cron

Nous avons déjà discuté du tableau et de la façon dont nous le remplissons d'emplois. Mais comment ces travaux sont-ils exécutés ? Un processus système appelé Daemon s'exécute en arrière-plan de notre machine Linux.

Il existe des démons pour de nombreux services différents. Ceux-ci sont généralement nommés en ajoutant un « d » à un nom de service.

Naturellement, le démon cron s'appelle "crond". Aucune action n'est requise de notre part pour exécuter ce démon, mais si vous pensez que la commande ne fonctionne pas correctement, vous pouvez utiliser la commande ps pour vérifier que "crond" est en cours d'exécution.

ps aux | grep crond

Cette commande recherchera les processus actuels pour tous les utilisateurs et renverra toutes les instances de "crond".

[email protected]:~$ ps ux | grep crond
christo+  8942  0.0  0.0  18612   840 pts/0    S+   02:16   0:00 grep --color=auto crond

Je peux voir que le démon est en cours d'exécution pour mon compte d'utilisateur. Je le savais déjà parce que j'ai rempli un fichier toute la journée avec une sortie.

Comprendre la syntaxe Crontab

Maintenant que vous avez une vague compréhension du fonctionnement de cron, examinons la syntaxe d'utilisation de crontab. J'espère que ce sera moins déroutant si vous pouvez imaginer ces informations sous forme de tableau dans votre esprit.

crontab [options]

* * * * *  <command> 
OR 
* * * * * <path/to/script>

Je vous promets que cela vous rendra service une fois que nous aurons notre propre exemple opérationnel. Reprenons la syntaxe des tâches cron.

Comme vous pouvez le voir, la syntaxe crontab comporte 5 astérisques. Voici ce que chacun de ces astérisques représente :

1er 2ème 3ème 4ème 5e
* * * * *
Identifiant Minute Heure Jour-Date Mois Nom du jour
Valeurs 0-59 0 -23 1-31 1-12 0-6

REMARQUE :les noms de jour 0 à 6 commencent par dimanche.

Afin de planifier une tâche, vous remplacez l'astérisque approprié par la valeur souhaitée.

Mettons-le à une pratique rapide. Si vous avez un crontab comme celui ci-dessous, quand pensez-vous que le travail s'exécutera ?

0 0 * * 0 

Q :Quand la commande sera-t-elle exécutée si vous définissez la tâche de cette manière ?

A. Toutes les heures du lundi au samedi
B. Toutes les minutes le dimanche
C. Uniquement à minuit du lundi au samedi
D. Uniquement à minuit le dimanche

La réponse ici est D. Exécutez la "commande" à 00h00 [minuit] tous les dimanches.

Configurer l'accès crontab pour votre compte utilisateur

Crontab est spécifique à l'utilisateur. Vous en avez déjà un peu parlé. Si vous pensez qu'il est possible que vous ayez déjà utilisé crontab auparavant, vous pouvez le vérifier en utilisant crontab -l .

[email protected]:~$ crontab -l
no crontab for christopher

[email protected]:~$ crontab -e
no crontab for christopher - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/code
  3. /bin/ed

Choose 1-3 [1]: 1

Lorsque j'exécute cette commande, vous pouvez voir que je n'ai pas de crontab sur ce système.

Comme je n'ai pas encore créé de crontab, lorsque j'utilise -e pour modifier le tableau, il me demande mon éditeur de texte préféré. Nano est suggéré comme le programme le plus facile à utiliser. Vous pouvez utiliser n'importe quel éditeur de texte en ligne de commande comme Vim ou Emacs. C'est vraiment à vous de décider.

Si vous ne réussissez pas au début, Sudo

Si vous essayez le crontab -e commande mais n'obtenez pas ce résultat, vous n'avez peut-être pas les privilèges d'utilisateur pour créer la table. Si vous avez un accès sudo, vous pouvez utiliser sudo pour définir la crontab.

sudo crontab -e <your_username>

Votre système chargera automatiquement votre crontab vers la bonne destination qui peut varier en fonction de la distribution, mais se trouve souvent dans un répertoire comme /var/spool/cron/crontabs . N'essayez pas de modifier les fichiers ici.

Que se passe-t-il si la tâche cron rencontre une erreur ?

Le comportement par défaut consiste à envoyer par e-mail sa sortie. Cette fonctionnalité est conçue pour les administrateurs qui peuvent envoyer automatiquement les journaux à une adresse e-mail "locale" sur le domaine du réseau.

Vous pouvez le configurer vous-même si vous avez un serveur de messagerie. Il existe également des moyens d'automatiser la sortie des e-mails vers GMail ou des services similaires. Cependant, ces méthodes sortent du cadre de cet article.

Au lieu de cela, nous examinerons deux manières courantes de contourner l'erreur.

1) Envoyer la sortie vers un fichier

Vous pouvez désigner un fichier vers lequel envoyer ce type de sortie, puis utiliser >> pour rediriger la sortie.

Utilisation de >> ajoutera des informations à un fichier existant, tandis qu'un seul > Le symbole écrasera le fichier. Ceci est important à savoir si vous souhaitez conserver un fichier journal volumineux qui met fréquemment à jour les enregistrements. Les deux créeront automatiquement le fichier s'il n'existe pas.

Exemple de tâche Cron :

0 * * * *  echo "Linux is Cool!" >> ~/crontab_log.txt

2) Utilisez /dev/null

Cela contournera l'option e-mail en supprimant essentiellement les données. L'erreur standard ("2") et la sortie standard ("1") sont toutes deux envoyées au fichier nul.

0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1

Vous avez peut-être remarqué que j'utilise des commandes echo pour les exemples. Il n'y a pas de raison particulière à cela, mais cela facilite la vérification des modifications et la "vérification de votre travail".

Si vous avez fait de la programmation, vous avez peut-être utilisé des commandes d'impression pour tester votre logique. C'est le même concept.

Essayons de configurer notre propre tâche cron. Si vous avez déjà "joué le jeu", c'est génial. Si ce n'est pas le cas, c'est le moment de préparer ce terminal et de vous amuser.

Exemples Crontab :commandes et scripts de planification

Je vous ai montré quelques exemples pendant que j'expliquais comment la sortie est acheminée. Cela vous a-t-il semblé pertinent ?

Permettez-moi de passer en revue le premier exemple.

Minute Heure Jour-Date Mois Nom du jour Commande
0 * * * * echo "Linux est cool !">> ~/crontab_log.txt

Définir la valeur des minutes sur "0" signifie que la commande s'exécutera toutes les heures, à l'heure exacte.

Planifications de tâches avancées

Vous pouvez modifier plusieurs valeurs à la fois. Si vous le souhaitez, vous pouvez remplacer les 5 astérisques par des spécifications.

Minute Heure Jour-Date Mois Nom du jour Commande
*/5 3-6 */5 */2 0,6 echo "Linux est cool !">> ~/crontab_log.txt

Une idée de ce que celui-ci dit? Pour les besoins de ce tutoriel, j'ai rendu ce travail particulièrement déroutant. Il serait inhabituel d'avoir quelque chose avec autant de paramètres "dans la nature", mais voyons si vous pouvez le déchiffrer. Pour quelque chose comme ça, j'aime travailler à rebours dans les champs.

Essayons cela ensemble :

Champ Valeur Signification
Nom du jour 0,6 Samedi et dimanche
Mois */2 Chaque mois qui est divisible par 2 mois (pairs).
Jour Date * Chaque jour
Heure 3-6 Entre 3h et 6h
Minutes */5 Toutes les 5 minutes

En langage clair :

Ainsi, tous les deux mois, le week-end, quelle que soit la date, cette commande s'exécutera toutes les 5 minutes entre 3 h et 6 h.

Wow, c'était alambiqué. Si vous avez pu suivre cela, vous êtes prêt à faire du cron avec les meilleurs d'entre eux.

Écrire un script d'automatisation cron simple pour sauvegarder des fichiers

Jusqu'à présent, les tâches cron que vous avez écrites n'ont fait qu'une chose. Cela peut être utile, mais vous souhaitez peut-être effectuer plusieurs tâches.

Heureusement, ce n'est pas seulement possible mais aussi très facile. Si vous vous souvenez de l'exemple de syntaxe d'origine, vous pouvez également utiliser un chemin vers un script.

Cela ne se limite pas non plus à bash, vous pouvez également implémenter un script qui utilise Python ou Perl si vous le souhaitez.

Quels sont nos objectifs ?

  • Les travaux seront traités à 3 h du matin chaque soir
  • Sauvegarder le dossier /Documents dans un fichier zip
  • Générer un fichier texte avec une liste de tout ce qui se trouve dans le répertoire
  • Créer un dossier d'archive qui clone notre sauvegarde et notre fichier texte dans un sous-dossier avec la date actuelle

our_backup_script.sh

#! /bin/bash

DATE=$(date +%d-%m-%Y)
# Date in format DAY##-MONTH##-YEAR####

mkdir -p ~/archive/$DATE
# create a folder for today's date in the archive, if archive doesn't exist, make archive 
ls -al ~/Documents > ~/archive/$DATE/contents.txt
# create a text file listing the contents of the documents folder
cd ~/  && tar -cpzf $DATE.docs.backup.gz Documents/*
# change to parent directory to tar /Documents folder
cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz
# one .gz file is left in the home directory, a clone is sent to our archive under it's date
[email protected]:~$ ls
 Desktop     Downloads   Music                  Pictures   Public      Videos
 Documents   ENV         our_backup_script.sh   projects   Templates  'VirtualBox VMs'
[email protected]:~$ bash our_backup_script.sh 
[email protected]:~$ ls
 25-11-2019.docs.backup.gz   Documents   Music                  projects    Videos
 archive                     Downloads   our_backup_script.sh   Public     'VirtualBox VMs'
 Desktop                     ENV         Pictures               Templates
[email protected]:~$ ls archive/25-11-2019/
contents.all_files.txt  documents_archive.gz

Il ne reste plus qu'à faire de ce script une tâche cron.

crontab -e

Et ajoutez ce qui suit :

0 3 * * * bash ~/our_backup_script.sh

Le vôtre a-t-il réussi ? Le mien était. En fait, j'ai tellement aimé l'idée que je pourrais simplement garder cela comme sauvegarde quotidienne. Une modification que je vais apporter est de déplacer mon archive vers un dossier sur ma machine qui se synchronise avec le stockage cloud.

Une autre façon de planifier des tâches sous Linux consiste à utiliser la commande at. Cela pourrait également vous intéresser.

Avez-vous des idées pour un script que vous pourriez vouloir créer ? Cet article vous a-t-il aidé à mieux comprendre crontab ? Partagez avec nous dans les commentaires.


Linux
  1. Commande Linux wc avec exemples

  2. Commande Linux Tee avec exemples

  3. Commande principale Linux avec exemples

  4. Commande JQ sous Linux avec exemples

  5. 6 Exemples de commandes Linux Crontab

Commande Tr sous Linux avec des exemples

15 Commande Linux ps avec exemples

Commande de CD Linux avec exemples

Linux Crontab :15 exemples de tâches Cron impressionnants

Comment planifier des tâches avec Cron sous Linux

10 exemples cron utiles pour planifier des tâches sous Linux