Суть этого:
- Вам необходимо определить, запущена ли программа и не зависла ли она.
- Вам необходимо (пере) запустить программу, если она не запущена или зависла.
Есть несколько разных способов сделать # 1, но на ум приходят два:
Прослушивание сокета домена UNIX для обработки запросов о состоянии. Затем внешнее приложение может узнать, все ли в порядке с приложением. Если он не получит ответ в течение некоторого периода времени ожидания, то можно предположить, что запрашиваемое приложение заблокировано или является мертвым.
Периодически касаясь файла с предварительно выбранным путем. Внешнее приложение может посмотреть временную метку для файла, и если оно устарело, то оно может предположить, что приложение устарело или заблокировано.
Что касается # 2, то типичное удаление предыдущего PID и использование fork + exec для запуска нового процесса. Вы также можете подумать о том, чтобы превратить ваше приложение, которое запускается «непрерывно», в приложение, которое запускается один раз, но затем использовать «cron» или другое приложение, чтобы непрерывно перезапускать это однократное приложение.
К сожалению, сторожевые таймеры и выход из тупика - нетривиальные проблемы. Я не знаю ни одного общего способа сделать это, и немногие, которые я видел, довольно уродливы и не на 100% без ошибок. Однако tsan может помочь обнаружить потенциальные тупиковые ситуации и другие проблемы с многопоточностью при статическом анализе.