En Raspberry PI (ejecutando raspbian) necesito ejecutar el script encerrar/apagado, perono al reiniciar.
Mi primer intento fue definir un servicio de la siguiente manera:
[Unit]
Description=Power off service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/poweroff.sh
[Install]
WantedBy=multi-user.target
Esto funcionó, pero el script también se estaba ejecutando al reiniciar. Así que intenté instalarlo en un destino diferente:
[Install]
WantedBy=shutdown.target halt.target
Pero después de este cambio, el script no se ejecuta en absoluto.
¿Cuál es la forma correcta de definir las acciones que deben ejecutarse al apagar?
Respuesta1
Por lo que he recopilado en la red, la mejor opción es tenerlo Conflicts=reboot.target
en el archivo de la unidad ( [Unit]
sección) y luego ejecutar lo siguiente en el script:
systemctl list-jobs | egrep -q 'reboot.target.*start'
Si reboot.target
está programado para iniciarse, es un reinicio. De lo contrario, no lo es. Si el comando "tiene éxito", el sistema se reiniciará. De lo contrario, se está cerrando. Podrías usarlo así:
if ! systemctl list-jobs | egrep -q 'reboot.target.*start'; then
echo Shutting down
fi
Respuesta2
La respuesta de Daniel resuelve el problema de la pregunta. Pero todavía no era exactamente lo que necesitaba: el script se invocó demasiado pronto y necesitaba que se ejecutara lo más tarde posible (el script en realidad apaga la alimentación usando el relé conectado al GPIO
pin de RPi)
Después de invertir algo más de tiempo, encontré una solución mucho más sencilla que hacía exactamente lo que estaba buscando:
- Crear directorio
/etc/systemd/system/systemd-poweroff.service.d
si aún no existe - Cree un nuevo archivo
poweroff.conf
en/etc/systemd/system/systemd-poweroff.service.d
el directorio:
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh
Con este enfoque no es necesario agregar un nuevo servicio.