[systemd-devel] Springboot and systemd, clean shutdown

Brian Reichert reichert at numachi.com
Wed Oct 2 20:18:29 UTC 2024


On Wed, Oct 02, 2024 at 08:57:52PM +0200, Etienne Doms wrote:
> Hi,
> 
> https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html#ExecStop=
> 
> Your curl command just sends an HTTP POST request and waits for the
> reply, but at this point I guess your Spring Boot application is just
> shutting down, and has not yet cleanly terminated.

Ok, this (and others) provides a useful clue.

My hacky way of doing this, and this works for me:

  ExecStop=/usr/bin/curl -X POST localhost:${SERVER_PORT}/shutdown ; /usr/local/sbin/block_on -c -P ${SERVER_PORT}

'block_on' is a script I already had rattling around that blocks until
recources are freed up.  It's not pretty, but does what I needed.

Things I learned; these are documented, but I never really grasped some of
the subtleties:

  I didn't realize that ExecStart and ExecStop could be lists of
  commands. I've been relying on multiple ExecStopPost directives to
  introduce 'block_on', as I needed a syncronous way for 'systemctl
  stop webapp.service' to actually block until the process has
  stopped.

  I didn't realize the sense of success/failure only reflected
  ExecStop, not ExecStopPost directives.

> I remember in a past life having to deal with POSIX signahandling in a
> Java application and I ended up with Runtime.addShutdownHook()

I would have preferred the Java developers implemented a signal
handler, but that's out of my control.

For the record, many other sites seems to propose masking the 143 issue with

  SuccessExitStatus=143

but's that's clearly bogus. :/

I wish there was a systemd-pure way of implementing 'block until
PID exits'.

-- 
Brian Reichert				<reichert at numachi.com>
BSD admin/developer at large	


More information about the systemd-devel mailing list