semaine 13 - lancement et scripts
Le serveur qui travaille tout seul
Un bon administrateur est paresseux : tout ce qu'il fait deux fois, il l'automatise. Cette semaine, on assemble les commandes comme des Lego, puis on les lance sans nous.
- Chaîner et rediriger les commandes : |, &&, >, 2>&1.
- Céduler : crontab (répétition) et at (heure précise).
- Créer un daemon systemd : le script qui vit en permanence.
transitions - le pipe
| : le tube qui relie les commandes
$ commande1 | commande2
$ commande1 | commande2 | commande3
$ cat fichier | commande
Le pipe est LA philosophie Unix : de petites commandes spécialisées qu'on assemble en chaînes puissantes.
transitions - les conditions
&& et || : le if des commandes
$ commande1 ; commande2
$ commande1 && commande2
$ commande1 || commande2
$ commande &
Exemple bien connu : sudo apt update && sudo apt upgrade - la mise à niveau seulement si la mise à jour a réussi.
transitions - redirections
>, >> et < : rediriger vers les fichiers
$ commande > fichier
$ commande >> fichier
$ commande < fichier
$ sort < /etc/passwd > utilisateurs.txt
transitions - les flux
1> et 2> : la sortie normale et la sortie d'erreur
Chaque commande a DEUX sorties : stdout (flux 1, le résultat) et stderr (flux 2, les erreurs).
$ commande 1> /dev/null
$ commande 2> /dev/null
$ commande > normal.log 2> erreurs.log
/dev/null : le trou noir de Linux. Tout ce qu'on y envoie disparaît à jamais.
transitions - combinaisons
2>&1 : les combinaisons classiques
$ commande > tout.log 2>&1
$ commande >/dev/null 2>&1
$ commande &> tout.log
$ commande 2>&1
$ if wc < resultat.txt; then echo "Resultat vide" 1>&2; fi
le piege classique
L'ordre des redirections compte !
commande > log 2>&1
stdout vers log, PUIS stderr vers où est stdout (= log). Les deux dans le fichier. Correct !
commande 2>&1 > log
stderr vers où est stdout (= le terminal !), PUIS stdout vers log. Les erreurs restent à l'écran. Raté !
C'est LA gotcha la plus fréquente des redirections. Le 2>&1 se place toujours APRÈS le > log.
transitions - variables
$(commande) : transporter un résultat
$ variable=$(commande1)
$ commande2 $variable
$ commande2 $(commande1)
$ kernel=$(uname -r)
$ echo "Mon kernel est : $kernel"
L'ancienne syntaxe avec les accents graves `commande` fonctionne aussi ; $( ) est la moderne.
la boite a outils
grep et cut : filtrer lignes et colonnes
grep est un filtre HORIZONTAL (lignes), cut un filtre VERTICAL (colonnes).
$ cat fichier | grep "motif"
$ grep -v "motif" fichier
$ ps aux | grep "processus" | grep -v grep
$ commande | cut -d ' ' -f 3
$ commande | tr -s ' ' | cut -d ' ' -f 3
$ commande | cut -c 5-10
la boite a outils
tr, head et tail : transformer et trancher
$ commande | tr 'a' 'b'
$ commande | tr -s ' ' ' '
$ commande | tr -d 'x'
$ tr [:upper:] [:lower:] < texte.txt
$ commande | head -n 1
$ commande | tail -n 3
$ commande | head -n 4 | tail -n 1
(sed, le grand transformateur par regex, aura toute sa place la semaine prochaine.)
ceduler - crontab
crontab : la répétition programmée
$ crontab -e
10 13 * * * /home/prenom/dire-la-date.sh
Les règles d'or d'une commande sous crontab :
- Non interactive : pré-répondre à toutes ses questions, couper le verbeux.
- Chemin absolu (ou être dans le PATH).
- Script rendu exécutable :
chmod +x
- Syntaxe à vérifier sur crontab.guru
ceduler - at et compagnie
at : une seule fois, à une heure précise
$ at -t 03091251 -f /home/prenom/hasard.sh
Le panorama complet des lancements :
at
crontab -e
watch lacommande
while true; do ... done
exec unscript
le daemon
Créer un daemon systemd
Un daemon est un service lancé au démarrage du système. La recette en 3 fichiers-étapes :
#!/bin/bash
while true
do
# Le travail va ici
sleep 10
done
[Unit]
Description=Mon service a moi
[Service]
ExecStart=/usr/bin/script.sh
[Install]
WantedBy=multi-user.target
$ sudo systemctl enable monservice.service
$ sudo systemctl start monservice.service
resume
L'automatisation est en marche
Assembler
Pipes, conditions, redirections : les commandes deviennent des chaînes.
Céduler
at pour l'unique, crontab pour le répétitif.
Incarner
Le daemon systemd : votre script devient un service du système.
Au laboratoire de la semaine 13 : vos scripts se lanceront tout seuls, même pendant que vous dormez.