GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire uno script con systemd subito prima dell'arresto?

La soluzione suggerita è eseguire l'unità di servizio come un servizio normale:dai un'occhiata a [Install] sezione. Quindi tutto deve essere pensato al contrario, anche le dipendenze. Perché l'ordine di arresto è l'ordine di avvio inverso. Ecco perché lo script deve essere inserito in ExecStop= .

La seguente soluzione funziona per me:

[Unit]
Description=...

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

[Install]
WantedBy=multi-user.target

RemainAfterExit=true è necessario quando non hai un ExecStart azione.

Dopo aver creato il file, assicurati di systemctl daemon-reload e systemctl enable yourservice --now .

L'ho appena ricevuto da systemd IRC, i crediti andranno a mezcalero.


  • Eseguire un servizio immediatamente prima di iniziare qualsiasi servizio reboot/shutdown/halt/kexec (cioè nell'ultimo momento prima che il filesystem root diventi di sola lettura rimontato) usa questa configurazione del servizio:

    [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
    

    Abilitalo con:

    systemctl enable my_service.service
    
  • Per eseguire uno script immediatamente prima dell'effettivo reboot/shutdown/halt/kexec (quando non puoi scrivere sul filesystem root, perché è stato rimontato in sola lettura) aggiungi questo script eseguibile al /usr/lib/systemd/system-shutdown cartella.

    Immediatamente prima di eseguire l'effettivo sistema halt/poweroff/reboot/kexec systemd-shutdown eseguirà tutti gli eseguibili in /usr/lib/systemd/system-shutdown/ e passerà loro un argomento:"halt", "poweroff", "reboot " o "kexec", a seconda dell'azione scelta. Tutti gli eseguibili in questa directory vengono eseguiti in parallelo e l'esecuzione dell'azione non viene continuata prima che tutti gli eseguibili siano terminati.

Vedi anche:

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

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


Per quanto posso vedere questo fa quello di cui ho bisogno (ma non so esattamente perché).

[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

Linux
  1. Come configurare Systemd per trasformare un semplice script con Standardio in un servizio di rete?

  2. Come eseguo uno script prima di tutto il resto all'arresto con systemd?

  3. Come ottenere meno tty con Systemd?

  4. Systemd:come eseguire lo script solo allo spegnimento (non al riavvio)

  5. Configurazione del servizio Systemd per l'esecuzione con accesso root

Come eseguire container come servizio Systemd con Podman

Come eseguire lo script della shell come servizio Systemd in Linux

Come eseguire i pod come servizi di sistema con Podman

Come configurare l'esecuzione automatica di uno script Python utilizzando Systemd

Come eseguire lo script della shell come servizio SystemD in Linux

Come eseguire uno script Bash