Как убедиться, что приложение продолжает работать в Linux

Я пытаюсь обеспечить выполнение script на сервере разработки. Он сопоставляет статистику и предоставляет веб-сервис, поэтому он должен сохраняться, но несколько раз в день он умирает по неизвестным причинам. Когда мы замечаем, что мы просто запускаем его снова, но это боль в тылу, и некоторые пользователи не имеют разрешения (или ноу-хау), чтобы запустить его.

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

Я знаю, что мог бы cron- script ps через grep:

ps -A | grep appname

Но опять-таки, еще один час моей жизни потратил на то, чтобы сделать что-то, что уже должно существовать... Нет ли предварительно подготовленного приложения, которое я могу передать исполняемому файлу (необязательно с аргументами), и это будет поддерживать бесконечный процесс

В случае, если это имеет значение, это Ubuntu.

Ответ 1

Примечание: Upstart находится в режиме обслуживания и был остановлен Ubuntu, который использует systemd. Для получения подробной информации о том, как написать определение сервиса, следует обратиться к руководству по systemd.

Поскольку вы используете Ubuntu, вас может заинтересовать Upstart, который заменил традиционный sysV init. Одной из ключевых особенностей является то, что он может перезапустить службу, если она неожиданно умирает. Fedora перешла на выскочку, а Debian находится в экспериментальном состоянии, так что, возможно, стоит разобраться.

Это может быть излишним для этой ситуации, поскольку выполнение сценария cron займет 2 минуты.

#!/bin/bash
if [[ ! 'pidof -s yourapp' ]]; then
    invoke-rc.d yourapp start
fi

Ответ 2

Я использовал простой script с cron, чтобы убедиться, что программа запущена. Если нет, то он запустит его. Это не может быть идеальным решением, которое вы ищете, но оно просто и работает довольно хорошо.

#!/bin/bash
#make-run.sh
#make sure a process is always running.

export DISPLAY=:0 #needed if you are running a simple gui app.

process=YourProcessName
makerun="/usr/bin/program"

if ps ax | grep -v grep | grep $process > /dev/null
then
    exit
else
    $makerun &
fi

exit

Затем добавьте задание cron каждую минуту или каждые 5 минут.

Ответ 3

Monit идеально подходит для этого:)

Вы можете написать простые файлы конфигурации, которые сообщают monit, например, смотреть. порт TCP, файл PID и т.д.

monit будет запускать команду, которую вы указываете, когда процесс, который он контролирует, недоступен/используется слишком много памяти/слишком сильно привязывает процессор /etc. Он также вытащит оповещение по электронной почте, сообщающее вам, что произошло, и может ли он что-нибудь сделать с этим.

Мы используем его, чтобы поддерживать загрузку наших веб-сайтов, предоставляя нам раннее предупреждение, когда что-то происходит не так.

- Ваш верный сотрудник, Монит

Ответ 4

Если вы используете дистрибутив на основе systemd, такой как Fedora и последние выпуски Ubuntu, вы можете использовать systemd "Перезапустить" возможности для служб. Он может быть настроен как системная служба или как пользовательская служба, если ей нужно управлять и запускаться как конкретный пользователь, что, скорее всего, имеет место в конкретной ситуации OP.

Опция Restart принимает один из вариантов no, on-success, on-failure, on-abnormal, on-watchdog, on-abort или always.

Чтобы запустить его как пользователя, просто поместите в файл ~/.config/systemd/user/something.service следующий файл:

[Unit]
Description=Something

[Service]
ExecStart=/path/to/something
Restart=on-failure

[Install]
WantedBy=graphical.target

то

systemctl --user daemon-reload
systemctl --user [status|start|stop|restart] something

Отсутствует привилегия или модификация системных файлов root, нет заданий cron, ничего не нужно устанавливать, гибко, как черт (см. все соответствующие параметры службы в документации).

См. также https://wiki.archlinux.org/index.php/Systemd/User для получения дополнительной информации об использовании экземпляра system-user для каждого пользователя.

Ответ 5

Поместите свой цикл в цикле - поэтому, когда он выйдет, он снова запустится... while (true) {запустите мое приложение..}

Ответ 6

Я использовал cron "killall -0 programname ||/etc/init.d/programname start". kill будет ошибкой, если процесс не существует. Если он существует, он будет передавать нулевой сигнал процессу (который ядро ​​проигнорирует и не будет продолжать передавать).

Эта идиома проста для запоминания (ИМХО). Обычно я использую это, пока я все еще пытаюсь выяснить, почему сама служба не работает. IMHO программа не должна просто исчезнуть неожиданно:)

Ответ 7

Я не смог получить решение Chris Wendt для работы по какой-то причине, и его было сложно отладить. Это почти то же самое, но проще отлаживать, исключает bash из соответствия шаблонов. Для отладки просто выполните: bash ./root/makerun-mysql.sh. В следующем примере с mysql-сервером просто замените значение переменных для process и makerun для вашего процесса.

  • Создайте BASH - script как это (nano /root/makerun-mysql.sh):
#!/bin/bash
process="mysql"
makerun="/etc/init.d/mysql restart"
if ps ax | grep -v grep | grep -v bash | grep --quiet $process
then
    printf "Process '%s' is running.\n" "$process"
    exit
else
    printf "Starting process '%s' with command '%s'.\n" "$process" "$makerun"
    $makerun
fi
exit
  • Убедитесь, что он выполним, добавив правильные разрешения файлов (т.е. chmod 700 /root/makerun-mysql.sh)

  • Затем добавьте это в свой crontab (crontab -e):

# Keep processes running every 5 minutes
*/5 * * * * bash /root/makerun-mysql.sh

Ответ 8

Инструмент supervise из daemontools был бы моим предпочтением, но тогда все, что пишет Dan J Bernstein, является моим предпочтением:)

http://cr.yp.to/daemontools/supervise.html

Вам нужно создать определенную структуру каталогов для запуска вашего приложения script, но он очень прост в использовании.

Ответ 9

Это работа для DMD (демон мониторинга демонов). есть несколько вокруг; но я обычно пишу script, который проверяет, работает ли демон, и запускается, если нет, и помещает его в cron для запуска каждую минуту.

Ответ 10

прежде всего, как начать это приложение? Развертывает ли он себя на заднем плане? Это началось с nohup.. и т.д.? Если он последний, проверьте, почему он умер в nohup.out, если он первый, выполните запись журнала.

Что касается вашего основного вопроса: вы могли бы cron его или запустить другой процесс на фоне (не лучший выбор) и использовать pidof в bashscript, достаточно просто:

if [ `pidof -s app` -eq 0 ]; then
    nohup app &
fi

Ответ 11

Вы можете сделать это услугой, запущенной из inittab (хотя некоторые Linuxes перешли на что-то более новое в /etc/event.d). Эти встроенные системы гарантируют, что ваш сервис будет работать без написания собственных скриптов или установки чего-то нового.

Ответ 12

Отметьте "nanny", упомянутый в главе 9 (стр. 197 или около того) "Unix Hater Handbook" (один из нескольких источников для книги в формате PDF).

Ответ 13

Хороший, простой способ сделать это:

  • Запишите свой сервер, чтобы умереть, если он не может прослушивать порт, который он ожидает.
  • Установите cronjob, чтобы каждый раз запускать сервер.

Если он не запущен, он запустится, и если он будет запущен, это не произойдет. В любом случае ваш сервер всегда будет работать.

Ответ 14

Я думаю, что лучшее решение - если вы также проверите функцию. Например, если вам нужно было проверить apache, недостаточно проверить только, если существуют процессы "apache" в системах.

Если вы хотите проверить, есть ли apache OK, попробуйте загрузить простую веб-страницу и проверьте, находится ли ваш уникальный код в выходном файле.

Если нет, убейте apache с помощью -9, а затем выполните перезапуск. И отправьте письмо в корневой каталог (который является переадресованным почтовым адресом в корни компании/сервера/проекта).

Ответ 15

Это еще проще:

#!/bin/bash

export DISPLAY=:0

process=processname
makerun="/usr/bin/processname"

if ! pgrep $process > /dev/null
then
    $makerun &
fi

Вы должны помнить хотя бы о том, что имя процесса уникально.