Cron

De Banane Atomic
Aller à la navigationAller à la recherche

crontab

Bash.svg
# lister les tâches
crontab -l

# éditer les tâches
crontab -e
Utiliser sudo pour accéder au cron de root.
Spécifier le chemin complet des exécutables.
crontab
# format
# mm  hh  DD  MM  W  /path/progam
# mm  minute values can be from 0 to 59.
# hh  hour values can be from 0 to 23.
# DD  day_of_month values can be from 1 to 31.
# MM  month values can be from 1 to 12.
# W   day_of_week values can be from 0 to 6, 0 = Sunday.

# run every day at 4:00 am
0 4 * * *       $HOME/mon_script.sh

# toutes les minutes se terminant par 0 ou 5, toutes les 5 minutes
# entre 9:00 et 16:55
# pas de restriction sur day_of_month
# pendant les mois de janvier à mai (inclu) et septembre à décembre, tous sauf juin, juillet et août
# du lundi au vendredi (inclu)
*0,*5  9-16  *  1-5,9-12  1-5  $HOME/mon_script.sh

# toutes les 30 minutes
*/30 * * * *       $HOME/mon_script.sh

# toutes les heures
0 * * * *          $HOME/mon_script.sh

Éditeur par défaut

~/.bashrc
# par défaut l'éditeur est vi
export EDITOR=/usr/bin/nano
Bash.svg
# forcer l'éditeur
sudo EDITOR=nano crontab -e

Email

Si MAILTO est définit, la sortie du script est envoyée par email.

crontab
MAILTO=compte@gmail.com
MAILFROM=compte@mon-domaine.fr  # ne fonctionne pas
# MAILFROM par défaut: root@hostname

# désactiver l'envoie d'emails
MAILTO=""

# Pour envoyer un email seulement si une erreur s'est produite, rediriger la sortie standard vers /dev/null
# Ainsi un email sera envoyé seulement si quelque chose est écrit sur stderr 
0 * * * *       /path/mon_script.sh > /dev/null

# une autre solution est de rediriger directement la sortie du script dans un mail:
0 * * * *       /path/mon_script.sh 2>&1 | mail -s "Mon sujet" -r expéditeur@domaine.fr destinataire@domaine.fr
Avec MAILTO, le sujet du mail est « Cron <user@hostname> /chemin/du/script »

Envoyer un email seulement en cas d'erreur

On utiliser un script qui va lancer la tache cron et en fonction du code de retour, envoyer un email ou non.

crontab
# désactiver l'envoie d'emails avec MAILTO
MAILTO=""

0 * * * *       /path/crontask_emailer.sh /path/mon_script.sh
crontask_emailer.sh
#!/bin/bash

set -u
set -e
set -o pipefail

OUT=/tmp/crontask_emailer.out.$$

set +e
"$@" >$OUT 2>&1
RESULT=$?
set -e

if [ $RESULT -ne 0 ]
then
    cat "$OUT" | mail -s "Cron task error: $@" -r expéditeur@domaine.fr destinataire@domaine.fr
fi

rm -f "$OUT"

Installation de msmtp

Si Postfix n'est pas déjà installé.

Bash.svg
# installation
sudo pacman -S msmtp-mta
# configuration system
sudo cp /usr/share/doc/msmtp/msmtprc-system.example /etc/msmtprc
# ou configuration par utilisateur
cp /usr/share/doc/msmtp/msmtprc-user.example ~/.msmtprc

# test
sendmail -t << END_MESSAGE
> To: xxx@gmail.com
> Subject: sujet
> message
> END_MESSAGE

echo "message" | mail -s "sujet" -r expéditeur@mon-domaine.fr destinataire@gmail.com
~/.msmtprc
# Accounts will inherit settings from this section
defaults
auth             on
tls              on
tls_trust_file   /usr/share/ca-certificates/mozilla/Thawte_Premium_Server_CA.crt

# A first gmail address
account        gmail
host           smtp.gmail.com
port           587
from           xxx@gmail.com
user           xxx@gmail.com
password       xxx
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set a default account
account default : gmail

Modifier crontab depuis un script

Bash.svg
# commenter une ligne
crontab -l | sed 's|^[^#].*/script.sh|#\0|' | crontab -
# décommenter une ligne
crontab -l | sed 's|^#\(.*/script.sh\)|\1|' | crontab -

Anacron

Cron n’exécute pas les tâches qui étaient programmées lorsque l'ordinateur était éteint.
Sur les postes de travail qui ne sont pas en permanence allumés, il est préférable d'utiliser « Anacron » pour s'assurer que si le poste était éteint à l'heure où la tâche était prévu, celle-ci ne sera pas perdu mais exécutée au prochain démarrage du poste.
Anacron exécute les scripts présents dans les répertoires suivants:

  • /etc/cron.hourly/
  • /etc/cron.daily/
  • /etc/cron.weekly/
  • /etc/cron.monthly/
Les scripts du dossiers « /etc/cron.hourly/ » ne fonctionne pas en asynchrone
Si l'ordinateur n'est pas allumé, la tache n'est pas lancée au prochain démarrage.
Anacron utilise l'utilisateur root pour exécuter ses tâches.

Configuration

/etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45

# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days     delay in minutes    job-identifier  command
1                   5	                cron.daily      nice run-parts /etc/cron.daily
7                   25	                cron.weekly     nice run-parts /etc/cron.weekly
@monthly            45	                cron.monthly	nice run-parts /etc/cron.monthly
Comme il est possible d'ajouter des scripts dans les dossiers « /etc/cron.*/ », il n'est pas nécessaire de modifier la configuration d'Anacron.

Fichiers timestamp

Le dossier « /var/spool/anacron » contient les fichiers timestamp. Ces fichiers contiennent la date de la dernière exécution de leur tache.

/var/spool/anacron/cron.weekly
20140616

Ici la tache cron.weekly a été exécutée le 16/06/2014. C'est cette date qui servira a calculer quand cette tache devra a nouveau être exécutée.

Debug

Bash.svg
# affiche la sortie lorsque des tâches sont exécutées
anacron -fnd

Installation

Cronie est déjà installé (paquet base).

Bash.svg
# démarrer cronie
sudo systemctl start cronie

# activer cronie au démarrage
sudo systemctl enable cronie