GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo ejecutar un script con systemd justo antes de apagar?

La solución sugerida es ejecutar la unidad de servicio como un servicio normal:eche un vistazo al [Install] sección. Así que todo tiene que pensarse al revés, las dependencias también. Porque el orden de apagado es el orden de inicio inverso. Es por eso que el script debe colocarse en ExecStop= .

La siguiente solución me funciona:

[Unit]
Description=...

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

[Install]
WantedBy=multi-user.target

RemainAfterExit=true es necesario cuando no tienes un ExecStart acción.

Después de crear el archivo, asegúrese de systemctl daemon-reload y systemctl enable yourservice --now .

Lo acabo de recibir de systemd IRC, los créditos van a mezcalero.


  • Para ejecutar un servicio justo antes de comenzar cualquiera de los servicios de reinicio/apagado/detención/kexec (es decir, en el último momento antes de que el sistema de archivos raíz se vuelva a montar como de solo lectura) use esta configuración de servicio:

    [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
    

    Habilítalo con:

    systemctl enable my_service.service
    
  • Para ejecutar un script justo antes del real reboot/shutdown/halt/kexec (cuando no puede escribir en el sistema de archivos raíz, porque se volvió a montar de solo lectura) agregue este script ejecutable al /usr/lib/systemd/system-shutdown directorio.

    Inmediatamente antes de ejecutar el sistema real halt/poweroff/reboot/kexec systemd-shutdown ejecutará todos los ejecutables en /usr/lib/systemd/system-shutdown/ y les pasará un argumento:"halt", "poweroff", "reboot " o "kexec", según la acción elegida. Todos los ejecutables en este directorio se ejecutan en paralelo, y la ejecución de la acción no continúa hasta que finalizan todos los ejecutables.

Ver también:

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

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


Por lo que puedo ver, esto hace lo que necesito (pero no sé exactamente por qué).

[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. Cómo administrar los servicios de Systemd con Systemctl en Linux

  2. Linux:¿cómo ejecutar un script con Systemd justo antes del apagado?

  3. ¿Cómo escribir un script de inicio para Systemd?

  4. ¿Cómo ejecuto un script antes que todo lo demás al apagar con systemd?

  5. ¿Cómo ejecutar parte de un script con privilegios reducidos?

Cómo ejecutar contenedores como servicio Systemd con Podman

Cómo ejecutar Shell Script como servicio Systemd en Linux

Cómo ejecutar pods como servicios systemd con Podman

Cómo configurar la ejecución automática de un script de Python usando Systemd

Cómo ejecutar Shell Script como servicio SystemD en Linux

Cómo ejecutar un script Bash