11 ms·
I have the following unit file saved for that purpose: [Unit] # https://stackoverflow.com/questions/36729207/trigger-event-on-aws-ec2-instance-stop-ter
by vngzs 4y ago
I have the following unit file saved for that purpose:
[Unit]
# https://stackoverflow.com/questions/36729207/trigger-event-on-aws-ec2-instance-stop-terminate
Description=unlink agent from remote server
Before=shutdown.target
[Service]
Type=oneshot
EnvironmentFile=-/etc/environment
KillMode=none
ExecStart=/bin/true
ExecStop=/opt/service-name/shutdown-unlink
RemainAfterExit=yes
User=root
[Install]
WantedBy=multi-user.target
If I recall correctly, the KillMode=none is important as it causes the shutdown-unlink binary to escape systemd process supervision. Without it, you may deal with systemd immediately halting your shutdown unit (and killing the process) when it hits the shutdown target.
- CGamesPlay 4y agoYou unit races with the network being brought down, since it isn't listed as a "Before" target, FYI.
- boring_twenties 4y agoI could be mistaken, but I don't think even that would be sufficient? Before would make your command execute before the network is brought down, but it wouldn't have the latter wait for your command to actually complete.
- dghubble 4y agoThe post shows long-running stop scripts / containers and demonstrates them delaying shutdown (not with KillMode none though) @CGamesPlay network.target's "primary purpose is for ordering things properly at shutdown: since the shutdown ordering of units in systemd is the reverse of the startup ordering, any unit that is order After=network.target can be sure that it is stopped before the network is shut down if the system is powered off." https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ https://www.freedesktop.org/wiki/Software/systemd/NetworkTar...
- AnssiH 4y agoThey need After=network.target, not Before=network.target. The shutdown order is the reverse of startup order, and they execute the payload on shutdown (ExecStop).
- AnssiH 4y agoThe "Before=shutdown.target" is superfluous, that is a default dependency (as regular services obviously need to be shut down before system shutdown). "KillMode=none" shouldn't be necessary, unless your command leaves processes running that need to stay running (and in that case you have other problems, since those processes may not actually finish before the system is shut down). Systemd waits for your service to stop before reaching shutdown.target (per the default Before= and Conflicts= dependencies). Since your command probably needs networking, you also want "After=network.target" to ensure your command runs before network is torn down, as covered in sibling comments.
- vngzs 4y agoThanks. I ripped it from a colleague, and now I have some bugs to report.