Forum Programmation.shell lancer un script au début d'un shutdown

Posté par  . Licence CC By‑SA.
Étiquettes :
0
20
juil.
2018

Bonjour,

Je voudrais lancer un script shell lors de l'extinction de l'ordinateur.
Pas si difficile que ça… mais là où je coince c'est qu'il faudrait :
- que ce script se lance au tout début du shutdown avant l'arrêt du serveur X car il affiche un message via zenity
- que le script bloque le shutdown le temps qu'il finisse

J'ai essayé avec un service systemd mais je n'arrive pas à le lancer avant l'arrêt du serveur X.
Et il faudra aussi qu'il soit lancer avant la déconnexion de l'utilisateur car le service utilise son environnement graphique.

Voici mon service, qui arrive après l'extinction du serveur X.

[Unit]
Description=script à l'arrêt de l'ordinateur
After=graphical.target

[Service]
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/utilisateur/.Xauthority
Type=oneshot
RemainAfterExit=yes
ExecStop=/chemin/essai.sh

[Install]
WantedBy=multi-user.target

J'ai essayé avec dbus-monitor en pensant à PrepareForShutdown() mais je n'y arrive pas. On peut aussi faire un service sytemd avec dbus (sans succès pour moi).

Cela fait des heures que j'écume le web (et même plusieurs jours), j'ai appris plein de trucs intéressants mais globalement il faut dire qu'internet ne regorge pas de ressource sur ce cas précis…

Bref je ne sais pas par quel bout m'y prendre. Suis-je même sur une bonne voie ???

Auriez-vous une idée ?
Merci d'avance.

  • # shutdown +n

    Posté par  . Évalué à 1.

    Dans ton script tu lui dit de s’éteindre dans +n minute ou seconde shutdown +n

    Merci aux personnes qui mon aidé a trouvé des solutions pour essayer d’écrire sans faute d’orthographe.

  • # shutdown

    Posté par  . Évalué à 5.

    After=graphical.target

    Je suis pas sûr mais cette ligne là ça ne veut pas dire au contraire d’attendre que X soit lancé avant de lancer ton script… d’ailleurs où est-il indiqué ?

    ExecStop=/chemin/essai.sh

    Ça c’est un script à lancer quand ta unit a terminé…

    Bref… Quel est ton besoin initial, le besoin précédent celui de vouloir lancer un script au moment du shutdown ? Parce que tu parles d’afficher un message, or la commande shutdown accepte justement un message (à afficher à tous les utilisateurs) comme argument… Ça sert précisément à prévenir les utilisateurs que la machine va rebooter, dans X minutes, et qu’ils doivent prendre leurs dispositions (enregistrer leurs fichiers en cour d’édition, fermer leur session), ce serait pas ça ton besoin ? :)

    Ceci dit je ne sais pas si ce message est aussi balancé aux utilisateurs qui sont en graphique… c’est à tester.

    • [^] # Re: shutdown

      Posté par  . Évalué à 1.

      Merci pour vos réponses.

      En fait mon script lance une sauvegarde du système. La sauvegarde est un peu longue c'est pour ça qu'il affiche une message signalant son fonctionnement. Il ne comprend pas l'instruction shutdown puisqu'il se déclenche quand l'utilisateur choisir (à partir de son environnement graphique) d'éteindre la machine.

      Mon service fonctionne sans message utilisant X (je l'ai testé).

      L'instruction After=graphical.target est censée initialiser le script uniquement après l'arrivée en mode multi-utilisateur avec interface graphique lors du démarrage de l'ordinateur et comme il ne s'exécute qu'à l'extinction de la machine (ExecStop=/chemin/essai.sh) et que les services sont alors éteint dans l'ordre inverse du démarrage je pensais que cela serait fonctionnel mais ça ne marche pas.

      Et comme je le disais il faudrait que le script soit exécuter avant que l'utilisateur soit déconnecté car il utilise son environnement graphique par les instructions Environment=DISPLAY=:0 et Environment=XAUTHORITY=/home/utilisateur/.Xauthority.

      Mais il y a quelque chose que je n'ai pas dû bien comprendre…

      • [^] # Re: shutdown

        Posté par  (site web personnel, Mastodon) . Évalué à 1. Dernière modification le 23 juillet 2018 à 14:38.

        Je ne suis pas expert systemd, mais pour moi, le problème est que SystemD est conçu pour justement pouvoir faire les choses en parallèle. Donc pour moi, le plus simple serait que ce soit ton script qui soit lancé lors de l'extinction (je ne pense pas que ce soit si compliquer de le mettre ua click sur le bouton, ou alors plus bourrin, remplacer la commande shutdown par ton script…) et que ce soit lui qui lance le véritable shutdown.

        Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.

        • [^] # Re: shutdown

          Posté par  . Évalué à 2.

          Merci de cette réponse.

          J’aurais voulu faire un peu moins "bourrin" mais remplacer la commande shutdown est effectivement une solution qui devrait fonctionner.

          Et effectivement systemd travaille en parallèle et je pense qu'une partie du problème réside là.
          Il y a systemd-inhibit commande pour justement bloquer le travail tant que la commande n'est pas finie mais il me manque encore quelque chose…

          Je continue mes recherches et si personne n'a trouvé la solution avant moi je ne manquerai pas de la partager (en espérant que je trouve).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.