Linux автоматически перезапускает приложение при сбое - Daemons - PullRequest
5 голосов
/ 11 сентября 2011

У меня есть система под управлением встроенного Linux, и очень важно, чтобы она работала непрерывно. По сути, это процесс обмена данными с датчиками и передачи этих данных в базу данных и веб-клиент.

Если происходит сбой, как автоматически перезапустить приложение?

Кроме того, есть несколько потоков, выполняющих опрос (например, сокеты и связь UART). Как я могу убедиться, что ни один из потоков не зависнет или не выйдет неожиданно? Есть ли простой в использовании сторожевой таймер, дружественный к потокам?

Ответы [ 4 ]

6 голосов
/ 12 сентября 2011

Вы можете без проблем перезапустить ваш процесс, когда он умрет с fork и waitpid, как описано в этом ответе . Это не потребует значительных ресурсов, поскольку ОС будет совместно использовать страницы памяти.

Что оставляет только проблему обнаружения зависшего процесса. Для этого вы можете использовать любое из решений, указанных Майклом Аароном Сафяном, но еще более простым решением будет повторное использование системного вызова alarm с сигналом о прекращении процесса (используйте sigaction соответственно). Пока вы продолжаете вызывать alarm (т.е. пока ваша программа работает), она будет продолжать работать. Если вы этого не сделаете, сигнал сработает.
Таким образом, не требуется никаких дополнительных программ, а используются только переносимые файлы POSIX.

6 голосов
/ 11 сентября 2011

Суть этого:

  1. Вам необходимо определить, запущена ли программа и не зависла ли она.
  2. Вам необходимо (пере) запустить программу, если она не запущена или зависла.

Есть несколько разных способов сделать # 1, но на ум приходят два:

  1. Прослушивание сокета домена UNIX для обработки запросов о состоянии. Затем внешнее приложение может узнать, все ли в порядке с приложением. Если он не получит ответ в течение некоторого периода времени ожидания, то можно предположить, что запрашиваемое приложение заблокировано или является мертвым.

  2. Периодически касаясь файла с предварительно выбранным путем. Внешнее приложение может посмотреть временную метку для файла, и если оно устарело, то оно может предположить, что приложение устарело или заблокировано.

Что касается # 2, то типичное удаление предыдущего PID и использование fork + exec для запуска нового процесса. Вы также можете подумать о том, чтобы превратить ваше приложение, которое запускается «непрерывно», в приложение, которое запускается один раз, но затем использовать «cron» или другое приложение, чтобы непрерывно перезапускать это однократное приложение.

К сожалению, сторожевые таймеры и выход из тупика - нетривиальные проблемы. Я не знаю ни одного общего способа сделать это, и немногие, которые я видел, довольно уродливы и не на 100% без ошибок. Однако tsan может помочь обнаружить потенциальные тупиковые ситуации и другие проблемы с многопоточностью при статическом анализе.

1 голос
/ 21 апреля 2017

используйте этот скрипт для запуска вашего приложения

#!/bin/bash

while ! /path/to/program   #This will wait for the program to exit successfully.
do
echo “restarting”                  # Else it will restart.
done

Вы также можете поместить этот скрипт в /etc/init.d/, чтобы запустить его как демон

.
1 голос
/ 06 июня 2012

Вы можете создать CRON-задание , чтобы проверить, запускается ли процесс время от времени с start-stop-daemon .

...