shutdown

reduce reboot/shutdown timeout

systemctl edit reboot.target
systemctl edit soft-reboot.target
systemctl edit ctrl-alt-del.target
systemctl edit poweroff.target

and change

[Unit]
JobTimeoutSec=30min 

or use unit override files.

run service at shutdown

run service very late

Drawbacks: If service is scheduled before shutdown.target it is started too late for some complex operation. Almost all services are stopped, tmpfs are unmounted and filesystems are remounted RO.

[Unit]
Description=Disable power output
DefaultDependencies=no
After=enable-power.service another-enable-power.service
Conflicts=enable-power.service another-enable-power.service
Before=shutdown.target reboot.target halt.target kexec.target
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/power_control disable
 
[Install]
WantedBy=shutdown.target
WantedBy=reboot.target
WantedBy=halt.target
WantedBy=kexec.target

run service in reverse order

Trick is to provide service without ExecStart= action only to provide correct ordering for ExecStop= action.

From systemd.unit doc:

  
  When two units with an ordering dependency between them are shut down,
  the inverse of the start-up order is applied
  
  Most importantly, for service units start-up is considered completed for
  the purpose of Before=/After= when all its configured start-up commands
  have been invoked and they either failed or reported start-up success
[Unit]
Description=Disable power output
DefaultDependencies=no
 
# Shedule it BEFORE to run ExecStop AFTER during shutdown
Before=enable-power.service
 
# Want to run ExecStop after eley-device is stopped
Before=another-enable-power.service
 
Before=basic.target
After=sysinit.target local-fs.target
 
Before=shutdown.target reboot.target halt.target kexec.target
Conflicts=shutdown.target reboot.target halt.target kexec.target
 
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/bin/power_control disable
ExecStop=/bin/true
 
 
[Install]
WantedBy=basic.target