Mini-test 4 (v2)
Format des 5 champs, pieges des chemins, redirection
9 questions ciblees
Cliquez Voir la solution pour estimer votre score
Question 1 / 9 drag-and-drop
Les 5 positions d'une ligne crontab :
L'ordre exact, de gauche a droite :
| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| minute | heure | jour du mois | mois | jour de la semaine |
| 0-59 | 0-23 | 1-31 | 1-12 | 0-6 |
Symboles a connaitre :
* = chaque valeur possible*/N = toutes les N unites (ex. */15)1,3,5 = liste de valeurs1-5 = intervalle@reboot, @daily, @hourlyQuestion 2 / 9 choix de reponse
30 3 * * * → tous les jours a 3h30 (minute 30, heure 3)*/10 * * * * → toutes les 10 minutes (le */10 dans le champ minute)0 4 * * 1 → tous les lundis a 4h00 (le 1 dans le champ 5 = lundi ; 0 ou 7 = dimanche)@reboot → a chaque demarrage du systemePieges typiques :
30 3 * * * n'est PAS "le 30 mars" ; les champs sont minute/heure et non jour/mois*/10 * * * * n'est PAS "a la minute 10" ; */10 = toutes les 10En cas de doute, crontab.guru explique en clair.
Question 3 / 9 corriger
/usr/local/bin/sauvegarde-ircd.sh.
Reecrivez la ligne corrigee (avec chemin absolu et capture des sorties dans /var/log/sauvegarde.log) :
$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 :
$PATH minimaliste, il ne trouvera pas sauvegarde-ircd.sh tout court>> ... 2>&1 capture stdout ET stderr dans un log, sinon les erreurs sont muettesQuestion 4 / 9 choix de reponse
> /dev/null 2>&12>&1 > /dev/null> /dev/null 2>1&> /dev/nullReponse : A — > /dev/null 2>&1
Decomposition :
> /dev/null envoie d'abord stdout (fd 1) dans le trou noir2>&1 envoie ensuite stderr (fd 2) au meme endroit que stdout - qui pointe deja vers /dev/null2>&1 AVANT > /dev/null, stderr est duplique vers stdout pendant qu'il pointe encore sur la console, puis seul stdout est redirige - stderr ressort donc en clair.Pourquoi pas les autres ?
2>&1 > /dev/null) : ordre inverse, stderr finit sur la console (cf. ci-dessus)> /dev/null 2>1) : il manque le &. Sans lui, 2>1 redirige stderr vers un fichier nomme litteralement "1" dans le repertoire courant. Erreur classique.&> /dev/null) : syntaxe bash uniquement. Cron sur Ubuntu/Debian utilise /bin/sh (dash) par defaut, qui ne connait pas &>. La ligne echoue silencieusement.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
/var/log/audit.log, sans ecraser.
Completez la fin de la ligne :
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.
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 :
>> = append (ajoute), versus > qui ecrase2>&1 = "envoyer stderr (fd 2) au meme endroit que stdout (fd 1)"2>&1 apres >> fichierVariante courte (bash >= 4) : &>> /var/log/audit.log
Variante "tout au silencieux" : > /dev/null 2>&1
Question 6 / 9 shortcuts bash equivalents
/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.
| Shortcut bash | Forme portable (POSIX, /bin/sh) | Effet |
|---|---|---|
&> fichier | > fichier 2>&1 | stdout + stderr -> fichier (ecrase) |
&>> fichier | >> fichier 2>&1 | stdout + stderr -> fichier (append) |
cmd1 |& cmd2 | cmd1 2>&1 | cmd2 | les deux flux dans le pipe |
Pourquoi connaitre les DEUX formes ?
#!/bin/bash/bin/sh (dash sur Ubuntu/Debian), cron par defaut, BusyBox, etc.SHELL=/bin/bash en haut du crontabAstuce d'ordre (rappel) : dans la forme longue, 2>&1 vient apres > fichier (sinon stderr ne suit pas).
Question 7 / 9 utilisateur du cron
/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 normalcrontab -e sans sudo, avec sudo dans la ligne crontab/etc/cron.d/Maintenant, les syntaxes :
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 ?
sudo dans la ligne crontab demande un mot de passe par defaut (tty manquant). Echoue silencieusement. Configurer NOPASSWD est une rustine fragile.Question 8 / 9 verifier l'execution
Avant la commande : la reflexion. Cochez les approches generales valables pour savoir ce qui s'est passe (plusieurs reponses).
/var/log/syslog ou /var/log/cron.logMaintenant, la syntaxe :
man journalctl (sur les Ubuntu recents) ou cherchez dans
/var/log/syslog avec grep.
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"
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 ?
systemctl status s'applique aux services systemd, pas aux scripts isoles lances par cron. On peut faire systemctl status cron (le service cron lui-meme) mais ca ne montre que les dernieres lignes./tmp/cron.log n'existe pas par defaut. Cron envoie vers syslog/journald, pas vers /tmp.Question 9 / 9 composer 3 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
R pour recommencer.