Такие схемы и правда совсем ненадежные, хрупкие и причиняют много багов. А что если какой-то процесс должен был рестартовать, а не рестартовал? А если другой процесс рестартовали? А если там чего-то неправильно пошло?
В случае "опс" надо думать не о happy path, а о том, что может пойти не так, и как бы сделать систему более предсказуемую.
Пока что лучшее, с чем я работал - это blue/green deployment. То есть рядом стартуем инстанс, ждем, пока он не станет работать, а затем переводим трафик на него, а старый graceful shutdown'им. Так работает Marathon + при определенных настройках кубернетес.
Это и без докера делается, кстати. Капистрано позволяет что-то подобное организовать в пределах одного хоста. Там суть простая - деплоим приложение в другую директорию, стартуем, добавляем еще один апстрим nginx'а, затем nginx reload и ждем, пока новое приложение не оклемается. Оклемалось - SIGINT в старое и ждем, пока оно не доработает. Доработало - убиваем.
Это Zero Downtime, однако в то же время, самая надежная схема сделать подобные вещи, особенно если хелсчеки, liveness/readiness probes реально проверяют чего-то внутри инстанса