Как убедиться, что приложение работает в Linux - PullRequest
76 голосов
/ 18 ноября 2008

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

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

Я знаю, что может cron-скрипт ps через grep:

ps -A | grep appname

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

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

Ответы [ 15 ]

73 голосов
/ 26 мая 2009

Я использовал простой скрипт с 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 минут.

40 голосов
/ 18 ноября 2008

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

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

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

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

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

36 голосов
/ 18 ноября 2008

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

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

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

#!/bin/bash
if [[ ! `pidof -s yourapp` ]]; then
    invoke-rc.d yourapp start
fi
19 голосов
/ 17 декабря 2015

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

Параметр перезапуска принимает одно из 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

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

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

8 голосов
/ 30 декабря 2008

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

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

8 голосов
/ 18 ноября 2008

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

3 голосов
/ 11 июля 2016

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

  • Создайте BASH-скрипт, подобный этому (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
2 голосов
/ 11 июня 2015

Инструмент supervise из daemontools будет моим предпочтением, но тогда все, что пишет Дэн Дж. Бернштейн, является моим предпочтением:)

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

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

1 голос
/ 14 декабря 2011

Хороший, простой способ сделать это следующим образом:

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

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

1 голос
/ 18 ноября 2008

Ознакомьтесь с 'nanny', на который ссылается глава 9 (p197 или около того) «Справочника Unix Hater's» (один из нескольких источников для книги в формате PDF).

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