Exécution d’un script interactif au boot ?

Tags: #<Tag:0x00007f74dac90f08>

Bonjour,

Je cherche à lancer un script interactif au boot d’une machine virtuelle. Le but étant de poser une question et en fonction de la réponse j’adapte ma config réseau par exemple.

J’ai suivi un tuto pour utiliser systemd lien

Tout se passe bien, mon script se lance correctement mais au bout de 5sec, le démarrage continu et je me retrouve sur la page de login sans avoir laissé le temps à mon script de s’exécuter en entier.

Le contenu de mon_script.service est le suivant :

[Unit]Description=mon script interactif
windowAfter=getty@tty2.service

[Service]
Type=oneshot
ExecStart=/root/mon_script.sh
StandardInput=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=multi-user.target

Quelqu’un connaitrait-il l’astuce pour forcer systemd à attendre la fin de l’exécution de mon script ou le forcer à marquer une pause avant de passer à la suite ?

Pour info la VM est une Jessie de base sans interface graphique.

Merci d’avance :wink:

Ce qui serait intéressant, c’est de voir ton script proprement dit.

Bonjour Ricardo,

Pour le moment je n’ai rien de particulier ; juste un script de test :

#!/bin/bash

# Vers tty2
chvt 2

# Demande une variable
echo "Entrez un numero de LAN :"
read num

## Reconfiguration du fichier interfaces en fonction de num
#bash /chemin/vers/mon_deuxieme_script.sh num

#vers tty1
chvt 1

exit

Dans l’état actuel, le script se lance correctement et me demande une variable ; si je rentre un numéro et que je valide, je bascule sur tty1. Si je ne fais rien, systemd quitte le script au bout de 5sec et me renvoie sur l’invit de login en tty2 (logique puisque seule la commande chvt 2 a été passée).

Le gros soucis est que par la suite dans mon deuxième script, j’ai besoin de faire un stop sur networking.service, sleep 5 puis start de networking.service. Et c’est là que ça pèche car dans le meilleur des cas le stop a le temps de s’exécuter mais le start lui ne s’exécute jamais car systemd me redirige inexorablement sur tty2 au bout de 5sec et donc bien avant la fin d’exécution du script… je ne sais pas si je suis clair lol

bonjour,
je ne suis pas trop sur de ta demande mais en jouant avec

[unit]
Before=networking # ou autre
After= ???

tu devrais arriver a tes fins ? et ca évite les sleep

surcharger aussi network.service avec un After=tonservice

systemctl edit network.service

Merci papajoker mais malheureusement ça ne change rien car je n’ai pas le temps d’exécuter complètement mon script (le script est lancé et quitté au bout de quelques secondes). Le but à terme est aussi de modifier les fichiers de conf d’un DNS, d’un NGINX, d’un Postfix… Donc l’idéal serait vraiment que systemd attende la fin d’exécution de mon script.

Hello,

Ton tuto parle du paquet dialog, que je ne connais pas spécialement mais qui se comporte probablement comme whiptail que je connais.

C’est probablement l’utilisation de dialog qui fait que le script ne s’exécute pas jusqu’au bout.
En tout cas, whiptail te permet de définir une variable et de rester affiché tant que celle-ci n’est pas renseignée. Je pense que la commande read n’est pas suffisante pour empêcher le script de se fermer.

Tu peux essayer d’organiser ton script en 2 parties :

  1. Des question qui captent les variables
  2. Des sed ou tu concatènes en fin de fichier pour modifier la conf avant de relancer les services.

c’est Type= qui configure le comportement

Merci à tous les deux.

@vincentsan : concernant dialog j’ai essayé avec et sans mais j’ai le même comportement. Je vais me renseigner sur whiptail si tu penses que ça peut me convenir :wink:
Pour l’organisation c’est effectivement comme ça que je fais pour le moment : deux questions pour récupérer 2 variables et du sed pour remplacer un mot générique glissé dans les fichiers de conf par les variables récupérées supra. Quand je le lance à la main ça marche plutôt bien :slight_smile:
EDIT : Pas mieux avec whiptail et une inputbox :frowning:

@papajoker : Merci, je pense aussi creuser de ce côté là. J’ai essayé avec Type=simple mais le script ne se lance pas du tout… faut que j’en test d’autres ^^

Bon, y’a du mieux… même si je ne saurais pas vraiment dire pourquoi.

Mon script se lance et reste en attente, par contre j’ai un message de systemd “[*** ] A start job is running …” qui s’affiche pas dessus toutes les deux secondes rendant la fenêtre inexploitable ;(

Voilà ce que ça donne : image

Une idée pour passer les messages en arrière plan ou ne pas les afficher du tout ?

Je viens de faire un test qui m’a eu l’air assez concluant :
Tu ajoutes simplement à la fin de ~/.bashrc le chemin absolu vers ton script et celui-ci devrait s’exécuter correctement. Ceci dit, c’est un script post login, je ne sais pas si c’est ce que tu cherches… Il ne se lancera pas tout seul si tu ne te logues pas.

Merci vincentsan mais malheureusement je ne veux pas que le script se lance à chaque fois que j’ouvre ma session mais uniquement au démarrage de la station (et sans ouvrir de session).

EDIT : J’ai trouvé la solution suivante qui fonctionne chez moi :

J’ai édité /etc/default/grub et modifié comme suit :
GRUB_CMDLINE_LINUX_DEFAULT=quiet # etat pas defaut
GRUB_CMDLINE_LINUX=“console=tty12” # initialement sans valeur

enfin, on prend les modifs en compte avec un :
#update-grub

On redémarre et fini les messages perturbateurs… tant que je n’ai pas de soucis de boot je n’ai pas besoin des messages d’erreur lol

Merci pour vos conseils :slight_smile:

Hello,

Juste une petite précision, as-tu gardé cette ligne dans la définition de ton service ou as-tu mis /dev/tty12 à la place ?
Je viens d’essayer et si je ne bascule pas à la main sur tty2 rien ne s’affiche (j’ai tty2 dans /etc/default/grup ainsi que dans la définition du service systemd…). Soit dit en passant sur ma VM de test quand je bascule à la main, je n’ai pas de déconnexion du script interactif et pas de message intempestif au milieu de l’écran et ce sans avoir besoin d’éditer /etc/default/grub. Le problème est que le script s’exécute dans tty2. si je mets tty1 à la place le script se déconnecte

Salut,

J’ai gardé TTYPath=/dev/tty2 dans la définition du service systemd. Par contre j’ai mis GRUB_CMDLINE_LINUX="console=tty12" dans mon /etc/default/grub.

Comme ça mon script s’exécute dans tty2 puis re-bascule sur tty1 à la fin ; mes log systemd sont balancés dans tty12 (donc pas d’interférences).

J’utilise chvt 1 et chvt 2 pour changer de tty dans le script et je réinitialise tty 2 en tout fin de script pour reprendre la main dessus avec un #systemctl restart getty@tty2.service.

Merci de l’explication