Note: answer based only on docs, I didn't play with docker much.

If you choose scripting you could pick a higher layer than just `ps`, based on either:

- the [`docker-compose events`][1] CLI:

>     Usage: events [options] [SERVICE...]
>     
>     Options:
>         --json      Output events as a stream of json objects
> 
> Stream container events for every container in the project.

- the [`docker events`][2] CLI:

> **Description** 
> 
> Get real time events from the server

You'd be looking for the `die` event of the container(from [Extended description][3]):

> Use `docker events` to get real-time events from the server. These
> events differ per Docker object type.
> 
> **Object types**
> 
> CONTAINERS
> 
> - `die`

The event appears to be generated regardless of the restart policy (from [Docker Events Explained][4]):

[![enter image description here][5]][5]

But you're right, there's [a ton of monitoring tools][6] out there, I also suspect some already do what you're seeking.

Just aimlessly wandering through those links I got to [Implementing Docker event monitoring from scratch][7]:

> What else? **I can create alerts on them**. The next time any of my
> containers decide to puke and die, I can get an SMS message about
> their doomed state.




  [1]: https://docs.docker.com/compose/reference/events/
  [2]: https://docs.docker.com/engine/reference/commandline/events/
  [3]: https://docs.docker.com/engine/reference/commandline/#object-types
  [4]: https://gliderlabs.com/devlog/2015/docker-events-explained/
  [5]: https://i.sstatic.net/6vYMW.png
  [6]: https://www.google.com/search?q=docker%20monitor%20container
  [7]: https://scoutapp.com/blog/monitoring-docker-events