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

# 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

# after reboot
@reboot            $HOME/mon_script.sh
# 60 seconds after reboot
@reboot            sleep 60 && $HOME/mon_script.sh
format
mm hh DD MM W
minute 0 - 59 hour 0 - 23 day_of_month 1 - 31 month 1 - 12 day_of_week 0 = Sunday - 6

É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
Par défaut:
  • expéditeur root@hostname
  • destinataire cron-user@hostname
  • sujet Cron <user@hostname> command

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