GNU/Linux >> Tutoriels Linux >  >> Linux

Systemd :Comment exécuter le script à l'arrêt uniquement (pas au redémarrage)

J'ai enfin trouvé comment faire ça.

C'est un peu bidouilleur, mais ça marche.

J'ai utilisé une partie de ce fil :https://stackoverflow.com/questions/25166085/how-can-a-systemd-controlled-service-distinguish-between-shutdown-and-reboot

et ce fil :Comment exécuter un script avec systemd juste avant l'arrêt ?

J'ai créé ce service /etc/systemd/system/shutdown_screen.service

[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Qui sera exécuté à shudown/reboot/halt/whatever.(n'oubliez pas de l'activer)

Et dans mon script /usr/local/bin/shutdown_screen Je mets ceci :

#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)    
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1

Ce qui enverra un message d'arrêt à mon arduino, qui éteindra mon écran.


Selon le systemd.special man-page, vous devez utiliser Before=poweroff.target .

poweroff.target

A special target unit for shutting down and powering off the system.

Applications wanting to power off the system should start this unit.

runlevel0.target is an alias for this target unit, for compatibility with SysV.

De plus, comme je l'ai mentionné dans mon commentaire, vous devez mettre des scripts personnalisés dans /etc/systemd/system/ . Le /usr/lib/systemd/system/ Le répertoire est destiné à être utilisé pour les scripts fournis par le système.

Donc, peut-être quelque chose comme ça :

[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes

À la lecture des réponses ici, il semble y avoir beaucoup de malentendus sur le fonctionnement de systemd. Tout d'abord, n'utilisez pas de conflits pour exclure une cible. Il est important d'éviter que des services en conflit soient exécutés en même temps.

Si une unité a un paramètre Conflicts=sur une autre unité, démarrer la première arrêtera la seconde et vice versa.

Unité signifie un fichier .service pour lancer un service particulier et non une cible à atteindre. En d'autres termes Conflicts=reboot.target au mieux sans signification et au pire cela vous empêchera de redémarrer. Ne fais pas ça. Cela ne signifie pas qu'il ne faut pas l'exécuter au redémarrage. Cela signifie abandonner ce service ou reboot.target en fonction du moment et de la façon dont systemd interprète cette utilisation erronée des conflits.

Voici un exemple d'unité actuellement configurée (c'est-à-dire un fichier .service) qui ne s'exécute qu'à l'arrêt et non au redémarrage :

[Unit]
Description=Play sound
DefaultDependencies=no
Before=poweroff.target halt.target

[Service]
ExecStart=/usr/local/bin/playsound.sh
ExecStop=/usr/local/bin/playsound.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=poweroff.target halt.target 

poweroff.target est équivalent à l'ancien niveau d'exécution systemv0 qui n'est atteint qu'à l'arrêt. halt.target est un autre chemin d'arrêt utilisé par systemd qui n'est pas non plus accessible au redémarrage. La section install indique à systemd d'ajouter ce service à la liste qui doit être complétée avant poweroff.target ou halt.target sera considéré comme atteint.

Ce service est installé et fonctionne sur mon système.


Linux
  1. Linux - Comment exécuter un script avec Systemd juste avant l'arrêt ?

  2. Linux - Redémarrer uniquement l'espace utilisateur ?

  3. Comment arrêter ou redémarrer Linux

  4. Comment exécuter un fichier sans extension .sh dans le shell

  5. Comment nettoyer uniquement la cible dans buildroot

Comment redémarrer (redémarrer) Linux à partir de la ligne de commande

Comment éviter un arrêt ou un redémarrage accidentel sous Linux

Comment configurer l'exécution automatique d'un script Python à l'aide de Systemd

Comment exécuter un script Shell en tant que service SystemD sous Linux

Comment exécuter une commande dans un script shell ?

Comment arrêter ou redémarrer Debian 11