2

У меня есть работа, которую я хотел бы "демонизировать" в Unix: я хочу, чтобы она запускалась при загрузке компьютера, и я хочу, чтобы она перезагружалась, если она выключалась.

Простой способ сделать это - настроить cronjob, который запускается каждые 10 или 20 минут. Cronjob должен перезапустить приложение, если оно еще не запущено.

Как мне написать эту последнюю часть сценария:«Если задание в данный момент не запущено, запустите задание»?

7 ответов7

5

Если ваша программа работает на переднем плане, используйте runit Gerrit Pape. Преимущества:

  • Это довольно пуленепробиваемое доказательство (на основе daemontools Дэна Берштейна).
  • Он работает на самых разных платформах (портативных).
  • Он упакован в Ubuntu и Debian (вместе с выше).
  • Его относительно легко настроить (запустить скрипт, лог-скрипт, некоторые символические ссылки).
4

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

Что может сделать Monit

Monit может запустить процесс, если он не запускается, перезапустить процесс, если он не отвечает, и остановить процесс, если он использует слишком много ресурсов. Вы можете использовать Monit для мониторинга файлов, каталогов и файловых систем на предмет изменений, таких как изменения меток времени, изменений контрольных сумм или размеров. Вы также можете контролировать удаленные хосты; Monit может пропинговать удаленный хост и может проверять соединения порта TCP/IP и протоколы сервера. Монитором управляет простой в использовании управляющий файл, основанный на синтаксисе, ориентированном на токены свободного формата. Мониторинг журналов в системный журнал или в свой собственный файл журнала и уведомляет вас об условиях ошибки и состоянии восстановления с помощью настраиваемого предупреждения

Мне также нравится их философия дизайна:

Важно, чтобы инструмент системного мониторинга просто работал - все время, и вы должны быть в состоянии доверить ему это. Средство мониторинга системы должно быть ненавязчивым, и вы сможете забыть о нем после его установки. То есть до тех пор, пока sshd не умрет на вашем сервере, расположенном в 50 милях. Когда это происходит, полезно знать, что вы установили этот дополнительный уровень безопасности и защиты - просто подождите несколько секунд, и Monit перезапустит демон sshd. Также полезно получать оповещения по электронной почте до того, как диски сервера заполнятся, или если ваш http-сервер внезапно окажется с косой чертой.

Monit спроектирован как автономная система и не зависит от плагинов или каких-либо специальных библиотек для запуска. Вместо этого он работает прямо из коробки и может использовать уже существующую инфраструктуру в вашей системе. Например, Monit легко интегрируется с init и может использовать существующие rc-скрипты уровня запуска для управления сервисами. Есть также гибкость для тех особых случаев, когда вам нужна определенная настройка для службы.

Monit компилируется и работает на большинстве версий UNIX. Это небольшая программа, ее вес составляет чуть более 300 КБ. Существует поддержка компиляции с заменами glibc, такими как uClibc, если вам нужно, чтобы она была еще меньше.


Поскольку у вас нет доступа с правами root, такой скрипт может работать в соответствии с вашими требованиями:

«Если задание не запущено, запустите задание»

if [ $(ps ax | grep -v grep | grep "/usr/local/apache2/bin/httpd" | wc -l) -eq 0 ]
then
        echo "httpd Service not running"
        apachectl start
fi

вышеприведенный код написан мной и протестирован с помощью cron и демона Apache httpd. Он просто ищет вашу строку в текущем списке процессов. Если найдено 0 строк, он не работает, поэтому перезапустит его. Обязательно grep -v grep чтобы исключить поиск из результатов процесса. Попробуйте использовать полный путь к бинарному файлу, чтобы убедиться, что он находится в ваших запросах. Если вы используете, например, только httpd , то, открыв httpd.conf в vim, вы заставите программу думать, что служба httpd работает, хотя на самом деле это не так. Конечно, ваш метод запуска службы также будет другим.

1

Существуют также решения, специально предназначенные для работы в качестве сторожевого устройства и даже запуска в качестве сценариев служб, которые не создают pid-файлы и т.д. Пример такого решения - супервизор.

1

Этот подход быстрый и дешевый и не пуленепробиваемый:

#!/usr/bin/perl -w
$l = `ps x`;
if (not $l =~ /mzscheme/) {
        system('~/utils/src/plt/bin/mzscheme &');
}

Я поместил этот скрипт в файл cron.

0

Вы можете использовать блокировку файла. На сайте объясняется, как реализовать его в Python, но это должно быть довольно просто понять на других языках.

0

Еще одна идея (аналогичная предложению Джеффри Эйлсворта о блокировке файлов, хотя и более ориентированная на мир сценариев оболочки Unix) заключается в том, чтобы ваша задача cron проверяла PID-файл (см. Связанные вопросы по SO). Если ваше демонизированное приложение не создает PID-файл самостоятельно, вы можете сделать это в сценарии оболочки.

Основная идея заключается в следующем:

  1. Запустите ваше приложение из скрипта, который создает PID-файл (где-то вроде /home/username/run/Foo.pid), содержащий его PID.
  2. В вашей работе cron убедитесь, что PID-файл существует.
    1. Если он существует, проверьте, что PID все еще выполняет приложение.
    2. Если не запущен или PID-файл не существует, приложение умерло. Запустить снова.

Если вы когда-нибудь захотите запустить приложение Foo один раз, вы можете сделать все это в сценарии запуска и просто выполнить это как задание cron.

0

Вы можете использовать systemd. Большинство современных систем уже используют его.

Используйте Type=Simple

Тип = простой (по умолчанию): systemd считает, что служба запускается немедленно. Процесс не должен быть разветвленным. Не используйте этот тип, если для этого сервиса необходимо заказать другие сервисы, если только он не активирован через сокет.

Источник: https://wiki.archlinux.org/index.php/systemd#Service_types

И Restart=always

Пожалуйста, не делайте магию разветвления самостоятельно, так как другие инструменты уже делают это (и лучше, чем вы, и я могу это сделать).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .