← Semaine 13
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.
transitions - le pipe

| : le tube qui relie les commandes

# L'output de la premiere devient l'input de la seconde $ commande1 | commande2 # Et ca se chaine a volonte $ commande1 | commande2 | commande3 # Traiter un fichier avec une commande qui ne les supporte pas $ 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 # pas de if : les deux s'executent, quoi qu'il arrive $ commande1 && commande2 # if (commande1 reussit) alors commande2 $ commande1 || commande2 # if (commande1 ECHOUE) alors commande2 $ commande & # envoie la commande en arriere-plan (voir fg et bg)

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 # redirige dans le fichier (ECRASE) $ commande >> fichier # ajoute a la fin $ commande < fichier # la commande RECOIT le fichier en entree # Combine : traiter un fichier, ecrire le resultat ailleurs $ 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 # fait disparaitre l'affichage normal $ commande 2> /dev/null # fait disparaitre les erreurs $ commande > normal.log 2> erreurs.log # flux separes dans deux fichiers
/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 # TOUT dans un fichier SUPER-CLASSIQUE $ commande >/dev/null 2>&1 # TOUT disparait SUPER-CLASSIQUE $ commande &> tout.log # raccourci bash du premier $ commande 2>&1 # erreurs melangees au flux normal # Le cas rare 1>&2 : ajouter SON message au flux d'erreur $ 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

# La variable comme boite de transport $ variable=$(commande1) $ commande2 $variable # Ou directement : la commande dans la commande $ commande2 $(commande1) # Exemple concret : $ 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" # garde les lignes qui matchent $ grep -v "motif" fichier # garde les lignes INVERSES $ ps aux | grep "processus" | grep -v grep # grep s'exclut lui-meme de la liste ! $ commande | cut -d ' ' -f 3 # colonne 3, separateur espace $ commande | tr -s ' ' | cut -d ' ' -f 3 # tr -s ecrase les espaces repetes AVANT de couper $ commande | cut -c 5-10 # caracteres 5 a 10
la boite a outils

tr, head et tail : transformer et trancher

$ commande | tr 'a' 'b' # remplace caractere par caractere $ commande | tr -s ' ' ' ' # ecrase les repetitions (squeeze) $ commande | tr -d 'x' # efface ces caracteres $ tr [:upper:] [:lower:] < texte.txt # tout en minuscules $ commande | head -n 1 # la premiere ligne $ commande | tail -n 3 # les 3 dernieres lignes $ commande | head -n 4 | tail -n 1 # exactement la 4e ligne !

(sed, le grand transformateur par regex, aura toute sa place la semaine prochaine.)

ceduler - crontab

crontab : la répétition programmée

$ crontab -e # minute heure jour mois jour-semaine commande 10 13 * * * /home/prenom/dire-la-date.sh # = tous les jours a 13h10

Les règles d'or d'une commande sous crontab :

ceduler - at et compagnie

at : une seule fois, à une heure précise

# Lancer hasard.sh le 9 mars a 12h51 $ at -t 03091251 -f /home/prenom/hasard.sh

Le panorama complet des lancements :

at # a une heure precise, une fois crontab -e # en repetition cedulee watch lacommande # en repetition, maintenant, sous vos yeux while true; do ... done # en repetition dans un script exec unscript # un script lance d'un autre script
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 :

# 1. Le script immortel : /usr/bin/script.sh #!/bin/bash while true do # Le travail va ici sleep 10 done # 2. Le descripteur : /lib/systemd/system/monservice.service [Unit] Description=Mon service a moi [Service] ExecStart=/usr/bin/script.sh [Install] WantedBy=multi-user.target # 3. Activer et demarrer $ 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.