GNU/Linux >> Tutoriales Linux >  >> Linux

Systemd:cómo ejecutar el script solo al apagar (no al reiniciar)

Finalmente encontré cómo hacerlo.

Es un pensamiento un poco hacker, pero funciona.

He usado una parte de este hilo:https://stackoverflow.com/questions/25166085/how-can-a-systemd-controlled-service-distinguir-entre-apagar-y-reiniciar

y este hilo:¿Cómo ejecutar un script con systemd justo antes de apagar?

He creado este servicio /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

Que se ejecutará al apagar/reiniciar/detener/lo que sea (no olvide habilitarlo)

Y en mi guión /usr/local/bin/shutdown_screen Pongo lo siguiente:

#!/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

Lo que enviará un mensaje de apagado a mi arduino, quien apagará mi pantalla.


Según el systemd.special página de manual, debe usar Before=poweroff.target .

apagar.objetivo

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.

Además, como mencioné en mi comentario, debe colocar secuencias de comandos personalizadas en /etc/systemd/system/ . El /usr/lib/systemd/system/ El directorio está destinado a ser utilizado para scripts proporcionados por el sistema.

Entonces, tal vez algo como esto:

[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

Al leer las respuestas aquí, parece haber muchos malentendidos sobre cómo funciona systemd. En primer lugar, no utilice conflictos para excluir un objetivo. Es importante evitar que los servicios en conflicto se ejecuten al mismo tiempo.

Si una unidad tiene una configuración de Conflictos=en otra unidad, iniciar la primera detendrá la última y viceversa.

Unidad significa un archivo .service para lanzar un servicio particular, no un objetivo a alcanzar. En otras palabras, Conflicts=reboot.target no tiene sentido en el mejor de los casos y en el peor de los casos le impedirá reiniciar. No hagas esto. No significa que no ejecute esto al reiniciar. Significa abortar este servicio o reboot.target según el tiempo y cómo systemd interpreta este uso erróneo de conflictos.

Aquí hay un ejemplo de una unidad configurada actualmente (también conocida como archivo .service) que se ejecuta solo al apagar, no al reiniciar:

[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 es equivalente al antiguo systemv run level0 que solo se alcanza al apagar. halt.target es una ruta de apagado alternativa utilizada por systemd que tampoco se puede alcanzar al reiniciar. La sección de instalación le dice a systemd que agregue este servicio a la lista que debe completarse antes del poweroff.target o halt.target se considerará alcanzado.

Este servicio está instalado y ejecutándose en mi sistema.


Linux
  1. Cómo ejecutar automáticamente comandos/secuencias de comandos durante el reinicio o el inicio

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

  3. Cómo apagar o reiniciar Linux

  4. Cómo ejecutar un archivo sin extensión .sh en shell

  5. Cómo limpiar solo el objetivo en buildroot

Cómo reiniciar (reiniciar) Linux desde la línea de comandos

Cómo evitar el apagado o reinicio accidental en Linux

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 comando en un script de Shell?

Cómo apagar o reiniciar Debian 11