1. Création site Internet
  2. > Articles Techniques
  3. > Ubuntu, Debian, Linux
  4. > Automatisation de la reconnexion du clavier après la veille sous (...)
Automatisation de la reconnexion du clavier après la veille sous Linux

Automatisation de la reconnexion du clavier après la veille sous Linux

dimanche 23 juin 2024, par Guillaume Orsal

Sur mon laptop, sous Ubuntu, parfois après la sortie de veille je rencontre des problèmes avec mon clavier qui ne répond plus. Impossible de le débrancher / rebrancher évidemment et je suis obligé de passer par un clavier externe pour le relancer. Voici la solution d’automatisation mise en place pour la reconnexion.

Une analyse longue et minutieuse des logs système m’a permis d’identifier le message d’erreur suivant lorsque mon clavier cessait de fonctionner :

Failed to enable keyboard on isa0060/serio0

Si je ne veux plus me retrouver bloqué au réveil de l’appareil, il va falloir mettre en place un script qui va détecter et corriger l’erreur automatiquement.

Créer un script de surveillance et de reconnexion

La première étape consiste à créer un script qui vérifiera les erreurs de clavier dans les logs du noyau (dmesg) et reconnectera le clavier si nécessaire.

Pour éviter de relancer le clavier indéfiniment, il faut vérifier que la déconnexion est intervenue après la dernière relance du clavier, d’où le stockage de la date de dernière relance dans /var/log/last_keyboard_reconnect.

Créer le script avec la commande :

sudo vi /usr/local/bin/check_keyboard.sh

Puis y insérer le code suivant :

#!/bin/bash

# Chemin du fichier de log
LOGFILE="/var/log/keyboard_monitor.log"

# Fichier pour stocker l'heure de la dernière reconnexion
LAST_RECONNECT_FILE="/var/log/last_keyboard_reconnect"

# Initialisation de la date de dernière reconnexion
last_reconnect=0

# Test s'il y a déjà eu des déconnexions du clavier dans la session courante
if sudo dmesg | grep -q "atkbd serio0: Failed to enable keyboard on isa0060/serio0";
then
  # Oui, alors on récupère la date de dernière connexion depuis le fichier
  if [ -f $LAST_RECONNECT_FILE ]; then
   last_reconnect=$(cat $LAST_RECONNECT_FILE)
  fi
else
  # Non, alors on initialise le fichier contenant la date de dernière reconnexion
  echo 0 > $LAST_RECONNECT_FILE
fi

# Vérifier les erreurs de clavier dans dmesg depuis la dernière reconnexion
if sudo dmesg | awk -v ref="$last_reconnect" '{
   # Extraire le timestamp en enlevant les crochets
   match($0, /^\[([0-9]+\.[0-9]+)\]/, arr)
   timestamp = arr[1]

   # Comparer le timestamp avec la référence
   if (timestamp > ref) {
       print $0
   }
}' | grep -q "atkbd serio0: Failed to enable keyboard on isa0060/serio0" ; then

   # Reconnexion du clavier
   sudo sh -c 'echo -n "reconnect" > /sys/bus/serio/devices/serio0/drvctl'

   # Mise à jour de la date de dernière reconnexion
   last_error_time=$(sudo dmesg | grep "atkbd serio0: Failed to enable keyboard on isa0060/serio0" | tail -1 | awk '{print substr($1, 2, length($1) - 2)}')
   echo $last_error_time > $LAST_RECONNECT_FILE

   # Log
   echo "$(date +%Y%m%d-%T);$last_error_time;Clavier reconnecté" >> $LOGFILE
else
   echo "$(date +%Y%m%d-%T);$last_reconnect;Pas de problème détecté" >> $LOGFILE
fi

La reconnexion logiciel du clavier s’effectue dans le script par la commande :

sudo sh -c 'echo -n "reconnect" > /sys/bus/serio/devices/serio0/drvctl'

N’oubliez pas de rendre le script exécutable :

sudo chmod +x /usr/local/bin/check_keyboard.sh

Créer un hook systemd-sleep pour la sortie de veille

Pour moi le problème se présente en sortie de veille de l’ordinateur. Je vais donc utiliser le hook de systemd adapté : systemd-sleep

Pour cela, je vais placer un script dans le répertoire /lib/systemd/system-sleep/. Assurez-vous qu’il existe et sinon vous pouvez le créer par la commande :

sudo mkdir -p /lib/systemd/system-sleep/

L’ensemble des scripts dans ce répertoire sont exécutés à chaque mise en veille et sorte de veille. Je vais donc y créer un script :

sudo vi /lib/systemd/system-sleep/keyboard_resume.sh

Lors de l’appel de ce script, il reçoit plusieurs paramètre. Le premier paramètre $1 contient soit la valeur pre indiquant la mise en veille, soit la valeur post indiquant la sortie de la veille. Voici donc le script pour jouer le script de relancer du clavier au réveil de l’ordinateur :

#!/bin/bash

case $1 in
   post)
       /usr/local/bin/check_keyboard.sh
       ;;
esac

Ne pas oublier de rendre le script exécutable.

sudo chmod +x /lib/systemd/system-sleep/keyboard_resume.sh

L’analyse du fichier de log /var/log/keyboard_monitor.log après un réveil de l’ordinateur permettra de vérifier que le script s’est bien exécuté, et au besoin a reconnecté le clavier.

Spip | Plan du site | Mentions légales | RSS 2.0 |
© 2001-2024 Guillaume Orsal EI