web-dev-qa-db-fra.com

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

De quoi ai-je besoin pour mettre le [install] section, afin que systemd s'exécute /home/me/so.pl juste avant l'arrêt et également avant /proc/self/net/dev est détruit?

[Unit]
Description=Log Traffic

[Service]
ExecStart=/home/me/so.pl

[Install]
?
64
sid_com

La solution suggérée consiste à exécuter l'unité de service en tant que service normal - jetez un œil au [Install] section. Il faut donc tout penser à l'envers, les dépendances aussi. Parce que l'ordre d'arrêt est l'ordre de démarrage inversé. C'est pourquoi le script doit être placé dans ExecStop=.

La solution suivante fonctionne pour moi:

[Unit]
Description=...

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>

[Install]
WantedBy=multi-user.target

RemainAfterExit=true est nécessaire lorsque vous n'avez pas d'action ExecStart.

Après avoir créé le fichier, assurez-vous de systemctl daemon-reload et systemctl enable yourservice --now.

Je viens de le recevoir de systemd IRC, les crédits vont à mezcalero.

76
Matthias

Autant que je puisse voir, cela fait ce dont j'ai besoin (mais je ne sais pas exactement pourquoi).

[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target


[Service]
ExecStart=/usr/local/bin/Perl /home/me/log_traffic.pl --stop
Type=oneshot
8
sid_com
  • Pour exécuter un service juste avant de démarrer l'un des services de redémarrage/arrêt/arrêt/kexec (c'est-à-dire au dernier moment avant que le système de fichiers racine ne soit remonté en lecture seule) utilisez cette configuration de service:

    [Unit]
    Description=Save system clock on shutdown
    DefaultDependencies=no
    After=final.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
    
    [Install]
    WantedBy=final.target
    

    Activez-le avec:

    systemctl enable my_service.service
    
  • Pour exécuter un script juste avant redémarrage/arrêt/arrêt/kexec réel (lorsque vous ne pouvez pas écrire sur le système de fichiers racine, car il a été remonté en lecture seule) ajoutez ce script exécutable au /usr/lib/systemd/system-shutdown répertoire.

    Immédiatement avant d'exécuter le système réel, stop/poweroff/reboot/kexec systemd-shutdown exécutera tous les exécutables dans/usr/lib/systemd/system-shutdown/et leur transmettra un argument: "halt", "poweroff", "reboot "ou" kexec ", selon l'action choisie. Tous les exécutables de ce répertoire sont exécutés en parallèle et l'exécution de l'action n'est pas poursuivie avant la fin de tous les exécutables.

Regarde aussi:

https://www.freedesktop.org/software/systemd/man/bootup.html

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

6
Piotr Jurkiewicz

Je ne suis pas totalement sûr, mais je ne pense pas que vous ayez besoin de la partie d'installation bien que je l'aie ajoutée explicitement. Je n'ai pas non plus testé mais je pense que cela devrait vous aider à démarrer:

[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no

[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=shutdown.target
6
Ulrich Dangel