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.