Mini-test 4 (v2)

Cron & Redirections

Format des 5 champs, pieges des chemins, redirection

9 questions ciblees

drag & drop QCM redaction auto-evaluation

Cliquez Voir la solution pour estimer votre score

← → naviguer · I indice · S solution · R recommencer

Question 1 / 9 drag-and-drop

Les 5 champs cron, dans l'ordre

Glissez chaque etiquette vers la position qui correspond a son role dans une ligne crontab. Cliquez sur une etiquette deja deposee pour la retirer.
minute
heure
jour du mois
mois
jour de la semaine

Les 5 positions d'une ligne crontab :

Champ 1
0-59
Champ 2
0-23
Champ 3
1-31
Champ 4
1-12
Champ 5
0-6

L'ordre exact, de gauche a droite :

12345
minuteheurejour du moismoisjour de la semaine
0-590-231-311-120-6

Symboles a connaitre :

Question 2 / 9 choix de reponse

Decoder ces 4 lignes crontab

Pour chaque ligne, cliquez sur la seule reponse correcte parmi les 4 propositions.
30 3 * * * /usr/local/bin/sauvegarde.sh
Tous les jours
a 3h30
Le 30 mars
chaque annee
Toutes les
3h30
A la 3e seconde
de chaque minute
*/10 * * * * /usr/local/bin/check.sh
A la minute 10
de chaque heure
Toutes les
10 minutes
Tous les
10 jours
A 10h00
chaque jour
0 4 * * 1 /usr/local/bin/rapport.sh
Le 1er du mois
a 4h00
Tous les dimanches
a 4h00
Tous les lundis
a 4h00
A la 1e heure
chaque 4 jours
@reboot /usr/local/bin/notifier.sh
Quand le service cron
redemarre
Tous les jours
a minuit
Une fois
par mois
A chaque demarrage
du systeme

Pieges typiques :

En cas de doute, crontab.guru explique en clair.

Question 3 / 9 corriger

Corriger cette ligne crontab

Cette ligne ne tourne jamais alors qu'a la main le script marche. Le script est dans /usr/local/bin/sauvegarde-ircd.sh.
30 3 * * * sauvegarde-ircd.sh

Reecrivez la ligne corrigee (avec chemin absolu et capture des sorties dans /var/log/sauvegarde.log) :

2 problemes : (1) cron a un $PATH minimaliste, et (2) les erreurs vont nulle part. Pensez aussi a 2>&1.
30 3 * * * /usr/local/bin/sauvegarde-ircd.sh >> /var/log/sauvegarde.log 2>&1

Les 2 corrections :

Question 4 / 9 choix de reponse

Tout taire : stdout + stderr vers /dev/null

Vous voulez qu'une commande dans cron ne produise aucune sortie (ni les messages normaux, ni les erreurs). Quel suffixe choisir de maniere portable (cron utilise souvent /bin/sh, pas bash) ?
*/5 * * * * /usr/local/bin/check.sh [VOTRE CHOIX]
> /dev/null 2>&1
2>&1 > /dev/null
> /dev/null 2>1
&> /dev/null

Reponse : A — > /dev/null 2>&1

Decomposition :

Pourquoi pas les autres ?

Astuce : pour forcer bash dans crontab, mettre SHELL=/bin/bash en haut du crontab. Mais > /dev/null 2>&1 reste le reflexe portable.

Question 5 / 9 stdout + stderr

La redirection magique

Vous voulez qu'a la fin d'une ligne cron, tout ce que produit le script (sortie normale + erreurs) aille dans /var/log/audit.log, sans ecraser.

Completez la fin de la ligne :

*/5 * * * * /usr/local/bin/check.sh [VOTRE REPONSE]
Reponse :
Cherchez man bash et la section REDIRECTION. Le symbole magique pour "envoyer stderr au meme endroit que stdout" est 2>&1. Et >> au lieu de > pour ajouter.
BASH(1) - extrait : section REDIRECTION
SYMBOLES de base
       > FICHIER          stdout vers FICHIER, ecrase
       >> FICHIER         stdout vers FICHIER, append (ajoute a la fin)
       < FICHIER          lit stdin depuis FICHIER
       << DELIMITEUR     heredoc : lit texte inline jusqu'au delimiteur

DESCRIPTEURS de fichier (file descriptors)
       0     stdin   (entree standard)
       1     stdout  (sortie standard)
       2     stderr  (sortie d'erreur)

REDIRECTIONS de stderr et FUSION
       2> FICHIER         stderr vers FICHIER
       2>> FICHIER        stderr append vers FICHIER
       2>&1              stderr va au meme endroit que stdout (cle du combo)
       &> FICHIER         stdout ET stderr ensemble (bash uniquement, pas dash)
       &>> FICHIER        idem en append (bash >= 4)
       > /dev/null 2>&1  combo classique : "tout taire"

L'ORDRE des redirections compte
       > fichier 2>&1     OK : stdout va dans fichier, puis stderr suit stdout
       2>&1 > fichier     PIEGE : stderr est duplique vers stdout (= console) AVANT
                          que stdout soit redirige - donc stderr reste sur la console

HEREDOC
       << FIN             lit jusqu'a la ligne 'FIN', avec expansion de $variables
       << 'FIN'           idem mais SANS expansion (utile pour $, `, etc litteraux)
       <<- FIN            accepte les TABS de retrait (pas les espaces)

EXEMPLES contextualises (cron, scripts)
       # Capturer tout dans un log dedie, en append
       /usr/local/bin/script.sh >> /var/log/script.log 2>&1

       # Tout taire (utilise dans cron pour les jobs verbeux)
       /usr/local/bin/poll.sh > /dev/null 2>&1

       # Separer stdout et stderr dans deux fichiers
       /usr/local/bin/script.sh > out.log 2> err.log

       # Garder stderr sur la console, capturer juste stdout
       /usr/local/bin/script.sh > out.log

       # Heredoc avec sudo tee (pour ecrire dans un fichier protege)
       sudo tee -a /etc/fail2ban/jail.local > /dev/null <<'EOF'
       [ircd-hybrid]
       enabled = true
       EOF
>> /var/log/audit.log 2>&1

Decomposition :

Variante courte (bash >= 4) : &>> /var/log/audit.log

Variante "tout au silencieux" : > /dev/null 2>&1

Question 6 / 9 shortcuts bash equivalents

Les shortcuts bash — quelle est la forme normale ?

Bash propose des raccourcis pour les redirections combinees. Ils sont plus courts mais moins portables (cron utilise souvent /bin/sh qui ne les connait pas). Pour chaque shortcut affiche dans une case, glissez la vraie syntaxe portable equivalente.

Glissez chaque forme longue (POSIX, marche dans /bin/sh) vers le shortcut bash correspondant.

> fichier 2>&1
>> fichier 2>&1
2>&1 |
&> fichier
stdout + stderr, ecrase
&>> fichier
stdout + stderr, append (bash >= 4)
|& cmd
pipe stdout + stderr vers cmd
Shortcut bashForme portable (POSIX, /bin/sh)Effet
&> fichier> fichier 2>&1stdout + stderr -> fichier (ecrase)
&>> fichier>> fichier 2>&1stdout + stderr -> fichier (append)
cmd1 |& cmd2cmd1 2>&1 | cmd2les deux flux dans le pipe

Pourquoi connaitre les DEUX formes ?

Astuce d'ordre (rappel) : dans la forme longue, 2>&1 vient apres > fichier (sinon stderr ne suit pas).

Question 7 / 9 utilisateur du cron

Planifier un script qui demande sudo

Votre script doit ecrire dans /var/backups/ (proprietaire root). Un crontab -e normal ne marchera pas.

Avant la syntaxe : la reflexion. Cochez les approches valables (plusieurs reponses).

sudo crontab -e en tant qu'utilisateur normal
crontab -e sans sudo, avec sudo dans la ligne crontab
Fichier dans /etc/cron.d/
Lancer le script en cli a la main au bon moment

Maintenant, les syntaxes :

Alternative 1 :
Alternative 2 :

Approches valables : A et C.

A - sudo crontab -e

Edite le crontab de l'utilisateur root. Le script tournera en root au moment prevu.

C - fichier dans /etc/cron.d/

sudo tee /etc/cron.d/sauvegarde-ircd > /dev/null <<'EOF'
30 3 * * * root /usr/local/bin/sauvegarde-ircd.sh >> /var/log/sauvegarde.log 2>&1
EOF

Avantages : versionnable (git), inclus dans un paquet/script d'install. Format different : on doit specifier l'utilisateur (root) entre l'horaire et la commande.

Pourquoi pas les autres ?

Question 8 / 9 verifier l'execution

Voir si cron a tente de lancer le script

Hier soir le script ne semble pas avoir tourne. Vous voulez savoir si cron a au moins essaye de le lancer.

Avant la commande : la reflexion. Cochez les approches generales valables pour savoir ce qui s'est passe (plusieurs reponses).

journalctl du service cron (Ubuntu recent / systemd)
grep CRON dans /var/log/syslog ou /var/log/cron.log
systemctl status sur le nom du script
cat /tmp/cron.log

Maintenant, la syntaxe :

Commande :
Essayez man journalctl (sur les Ubuntu recents) ou cherchez dans /var/log/syslog avec grep.
JOURNALCTL(1) - extrait du manuel
NAME
       journalctl - interroger le journal systemd

SYNOPSIS
       journalctl [OPTIONS] [MATCHES...]

OPTIONS de filtrage
       -u UNIT              filtrer par service (ex: cron, ssh, nginx)
       --since TIME         depuis une date    ("yesterday", "1 hour ago", "2026-05-17")
       --until TIME         jusqu'a une date
       -b                   uniquement depuis le dernier boot
       -p PRIORITY          niveau de gravite minimal (err, warning, info, debug)
       _PID=N               filtrer par PID (un MATCH = champ=valeur)

OPTIONS de presentation
       -n N                 N dernieres lignes
       -f, --follow         suivre en temps reel (comme tail -f)
       -r, --reverse        plus recent en premier
       -o FORMAT            format (short, json, json-pretty, cat)
       --no-pager           ne pas passer dans less (utile en script)
       -x                   ajouter une explication a chaque message d'erreur

EXEMPLES
       # Tous les logs de cron depuis hier
       sudo journalctl -u cron --since yesterday

       # 50 dernieres lignes du service apache, sans pager
       sudo journalctl -u apache2 -n 50 --no-pager

       # Suivre les erreurs SSH en temps reel
       sudo journalctl -u ssh -f -p err

       # Logs depuis le dernier boot
       sudo journalctl -b

       # Cherche un mot precis dans tous les logs
       sudo journalctl --since today | grep "Failed password"
GREP(1) - extrait du manuel
NAME
       grep - chercher des motifs dans des fichiers

SYNOPSIS
       grep [OPTIONS] MOTIF [FICHIER...]

OPTIONS frequentes
       -i     insensible a la casse
       -r     recursif dans un dossier
       -n     numero de ligne devant chaque match
       -c     compter les lignes qui matchent
       -v     inverser (lignes qui NE matchent pas)
       -l     juste les noms de fichiers qui matchent
       -q     silencieux : seulement code de retour (0 si match)
       -F     motif litteral (pas de regex)
       -E     regex etendues (+ ? | () sans backslash)
       -A N   afficher N lignes APRES chaque match
       -B N   N lignes AVANT
       -C N   N lignes avant ET apres

CODES DE SORTIE
       0     au moins un match
       1     aucun match
       2     erreur

EXEMPLES
       # Trouver les executions de cron dans syslog
       sudo grep CRON /var/log/syslog | tail -20

       # Compter par fichier (utile pour stats)
       grep -rc "ERROR" /var/log/

       # Contexte (3 lignes avant + apres)
       grep -n -C 3 "Failed password" /var/log/auth.log

       # Idempotent : tester si un motif est present
       if grep -qF "[ircd-hybrid]" /etc/fail2ban/jail.local; then ... ; fi

Approches valables : A et B.

# Methode moderne (systemd)
sudo journalctl -u cron --since yesterday

# Methode classique (grep dans les fichiers logs)
sudo grep CRON /var/log/syslog | tail -20

Ce que vous y verrez :

May 12 03:30:01 serveur CRON[12345]: (root) CMD (/usr/local/bin/sauvegarde-ircd.sh)

Pourquoi pas les autres ?

Question 9 / 9 composer 3 lignes

Composer 3 lignes crontab

Toutes les lignes doivent avoir le chemin absolu et capturer stdout+stderr dans un log dedie.
a) Sauvegarde tous les jours a 2h15 :
b) Surveillance toutes les 5 minutes :
c) Rapport dimanche a 8h :
CRONTAB(5) - extrait du manuel (format des lignes)
FORMAT D'UNE LIGNE
       minute  heure  jour-du-mois  mois  jour-de-semaine  COMMANDE

       Tous les 5 champs sont obligatoires (sauf si on utilise une chaine raccourcie).
       La COMMANDE peut contenir des espaces, redirections, pipes, etc.

CHAMPS - valeurs autorisees
       minute             0-59
       heure              0-23
       jour-du-mois       1-31
       mois               1-12      (ou jan, feb, mar, ...)
       jour-de-semaine    0-7       (0 et 7 = dimanche ; ou sun, mon, ...)

OPERATEURS sur un champ
       *              n'importe quelle valeur autorisee
       N,N,N          liste de valeurs                 (1,15,30)
       N-M            plage de valeurs                 (1-5)
       */N            toutes les N valeurs             (*/5 dans minute = toutes les 5 minutes)
       N-M/P          plage avec pas                    (0-30/10 = 0, 10, 20, 30)

RACCOURCIS predefinis (a la place des 5 champs)
       @reboot            au demarrage du systeme
       @yearly            une fois par an    (0 0 1 1 *)
       @monthly           une fois par mois  (0 0 1 * *)
       @weekly            une fois par semaine (0 0 * * 0)
       @daily             une fois par jour  (0 0 * * *)
       @hourly            une fois par heure (0 * * * *)

VARIABLES D'ENVIRONNEMENT (a mettre en haut du crontab)
       SHELL=/bin/bash          force le shell (defaut /bin/sh)
       PATH=/usr/local/bin:...  attention : PATH minimal par defaut
       MAILTO=user@example      ou rediriger les mails de stderr (vide = pas de mail)

REGLES VITALES pour cron
       - TOUJOURS utiliser des CHEMINS ABSOLUS pour les commandes et fichiers
       - Le PATH par defaut est tres minimal (ne pas compter sur "python3" tout court)
       - Le HOME est positionne, mais le CWD ne l'est pas - utiliser cd ou des chemins absolus
       - Toujours rediriger stdout + stderr ailleurs (sinon mail a root)
       - Tester d'abord en bash interactif, puis dans une commande "su - user -c '...'"

EXEMPLES
       15 2 * * *      /usr/local/bin/sauvegarde.sh   >> /var/log/sauvegarde.log 2>&1
       */5 * * * *     /usr/local/bin/check.sh        >> /var/log/check.log 2>&1
       0 8 * * 0       /usr/local/bin/rapport.sh      >> /var/log/rapport.log 2>&1
       0 4 * * 1-5     /usr/local/bin/maintenance.sh  >> /var/log/maint.log 2>&1
       @reboot         /usr/local/bin/notifier.sh     >> /var/log/boot.log 2>&1

VOIR AUSSI
       crontab -e            editer le crontab de l'utilisateur courant
       crontab -l            lister le crontab courant
       crontab -r            retirer (effacer) tout le crontab - ATTENTION
       /etc/cron.d/          drop-in fichiers (un fichier par projet, format "user commande")
       /etc/cron.daily/      scripts executes une fois par jour
# a) Sauvegarde quotidienne 2h15
15 2 * * * /usr/local/bin/sauvegarde-ircd.sh >> /var/log/sauvegarde.log 2>&1

# b) Surveillance fine
*/5 * * * * /usr/local/bin/surveiller-ircd.sh >> /var/log/audit.log 2>&1

# c) Rapport hebdo (dimanche = 0 ou 7)
0 8 * * 0 /usr/local/bin/rapport-hebdo.sh >> /var/log/rapport.log 2>&1

Reflexes appliques : chemins absolus, redirection en append, un log par tache, heures decalees.

Bilan

Ce que vous venez de pratiquer

R pour recommencer.

« Retour aux mini-tests