Respuestas:
La solución sugerida es ejecutar la unidad de servicio como un servicio normal; eche un vistazo a la [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 se debe colocar el guión 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 una ExecStart
acción.
Después de crear el archivo, asegúrese de systemctl daemon-reload
y systemctl enable yourservice --now
.
Lo acabo de obtener de systemd IRC, los créditos van al mezcalero.
RemainAfterExit=true
se requiere cuando no existe ExecStart
es porque systemd
no intentará ejecutarse ExecStop
si cree que el servicio no se está ejecutando. RemainAfterExit=true
causa systemd
a creer que el servicio se está ejecutando, lo que provoca que se ejecute ExecStop
al apagar el equipo.
Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
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
kexec.target
al bit Antes
WantedBy=shutdown.target reboot.target halt.target
a la [Unit]
sección. Before=
& After=
no cambiar dependencias.
Para ejecutar un servicio justo antes de iniciar 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 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ítelo con:
systemctl enable my_service.service
Para ejecutar una secuencia de comandos justo antes de reiniciar / apagar / detener / kexec (cuando no puede escribir en el sistema de archivos raíz, porque se volvió a montar de solo lectura) agregue esta secuencia de comandos ejecutable al /usr/lib/systemd/system-shutdown
directorio.
Inmediatamente antes de ejecutar el sistema actual, detener / apagar / reiniciar / kexec systemd-shutdown ejecutará todos los ejecutables en / usr / lib / systemd / system-shutdown / y les pasará un argumento: "detener", "apagar", "reiniciar" "o" kexec ", dependiendo de 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 antes de que finalicen 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
final.target
. Idealmente, me gustaría que sea lo primero que se ejecute después de que el usuario lo haga $ sudo reboot
.
No estoy totalmente seguro, pero no creo que necesite la parte de instalación, aunque la agregué explícitamente. Tampoco lo probé, pero creo que debería ayudarte a comenzar:
[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no
[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
ExecStart=/bin/true
.