Перейти к содержанию
Fire Monkey от А до Я
  • 0

Создание сервиса (демона) нового стиля для Linux


Евгений Корепов

Вопрос

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

Исходники тут https://github.com/EvgeniyKorepov/LinuxDaemonNewStyle

Заметьте, теперь никаких потоков, все элементарно, systemd сделает всю работу за нас.

Половина кода - разбор параметров командной строки. Вторая половина - бесконечный цикл, ожидающий сигналов от экземпляра класса демона нового стиля . Код самого класса сократился на треть.

Если запустите приложения в консоли - будет самое обычное приложение, которые умрет при закрытии консоли. Запуск в качестве бессмертного демона - через systemd, причем он сможет автоматически перезапускать вашего демона при крахе. Эти параметры задаются в текстовом файле /etc/systemd/system/DaemonNewStyleTest.service

program DaemonNewStyleTest;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.IOUtils,
  System.SyncObjs,
  Posix.Stdlib,
  Posix.SysStat,
  Posix.SysTypes,
  Posix.Unistd,
  Posix.Signal,
  Posix.Fcntl,
  Posix.Syslog in 'Posix.Syslog.pas',
  UnitDaemonNewStyle in 'UnitDaemonNewStyle.pas';

var
  AEvent : TEventType;

begin
  if ParamCount = 0 then
  begin
    syslog(LOG_ERR, 'No parameters');
    ExitCode := EXIT_FAILURE;
    exit;
  end;

  if ParamStr(1).ToLower.Equals('stop') then
  begin
    if Daemon.Stop(30) then
      ExitCode := EXIT_SUCCESS
    else
      ExitCode := EXIT_FAILURE;
    exit;
  end;
  if ParamStr(1).ToLower.Equals('reload') then
  begin
    if Daemon.Reload() then
      ExitCode := EXIT_SUCCESS
    else
      ExitCode := EXIT_FAILURE;
    exit;
  end;

  if not ParamStr(1).ToLower.Equals('start') then
  begin
    syslog(LOG_ERR, 'Unknow parameters');
    ExitCode := EXIT_FAILURE;
    exit;
  end;

  syslog(LOG_NOTICE, 'main START');
  while Daemon.IsRunning do
  begin
    syslog(LOG_NOTICE, 'main LOOP');
    Daemon.Execute(AEvent);
    if AEvent <> TEventType.None then
      syslog(LOG_NOTICE, 'main Daemon receive signal');
    case AEvent of
      TEventType.Start :
      begin
        syslog(LOG_NOTICE, 'main Event START');
      end;
      TEventType.Reload :
      begin
        // Reload config
        syslog(LOG_NOTICE, 'main Event RELOAD');
      end;
      TEventType.Stop :
      begin
        syslog(LOG_NOTICE, 'main Event STOP');
        ExitCode := EXIT_SUCCESS;
        Sleep(10); // simulate destroy delay
        break;
      end;
    end;
    Sleep(1000);
  end;
end.
systemctl start DaemonNewStyleTest.service 
systemctl reload DaemonNewStyleTest.service 
systemctl stop DaemonNewStyleTest.service

 

Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...