IT заметки по программированию
IT заметки по программированию
IT заметки по программированию
IT заметки по программированию

Systemd создание сервисов в Ubuntu

Создание сервисов с помощью Systemd на Ubuntu позволяет вам управлять процессами и программами в операционной системе в качестве служб, автоматически запускать их при старте системы и управлять их состояниями (запуск, остановка, перезапуск). Вот как это можно сделать.

1. Создание файла службы (Unit File)

Файлы служб в systemd создаются с расширением .service и обычно хранятся в директории /etc/systemd/system/.

Пример: создание простого сервиса

Шаги:

  1. Создайте файл службы, например, /etc/systemd/system/my_service.service.
  2. Напишите следующий контент для службы:
    • [Unit]: Описывает сам сервис, его описание, зависимости (например, After=network.target означает, что сервис запустится после сети).
    • [Service]: Основная часть, которая указывает команду для выполнения (ExecStart), как перезапускать службу (Restart=on-failure), от какого пользователя запускать (User=myuser).
    • [Install]: Определяет, при каких условиях сервис должен быть активен при загрузке системы.

2. Загрузка и запуск сервиса

После того как вы создали файл службы, необходимо выполнить следующие команды:

  1. Перезагрузите конфигурации systemd, чтобы он распознал новый сервис:

     

  2. Запустите сервис вручную:

     

  3. Включите автоматический запуск сервиса при старте системы:

     

  4. Проверьте статус сервиса:

     

  5. Остановить сервис можно командой:

     

3. Основные опции systemd для сервисов

  • ExecStart: Команда для запуска службы.
  • ExecStop: Команда для остановки службы.
  • Restart=on-failure: Перезапуск сервиса при сбоях.
  • User=: Под каким пользователем запустить сервис.
  • Environment=: Определяет переменные окружения для запуска службы.

4. Логи и отладка

Systemd использует утилиту journalctl для управления логами сервисов.

  • Посмотреть логи для конкретного сервиса:
     
  • Отфильтровать логи по времени:
     

5. Пример: служба для веб-сервера

Если вы хотите создать службу для веб-сервера на основе Python:

  1. Скрипт /usr/local/bin/web_server.py:
     
  2. Unit-файл /etc/systemd/system/web_server.service:
     
  3. Перезагрузите systemd, запустите и включите службу:
     

Теперь веб-сервер будет автоматически стартовать при запуске системы.

6. Проверка и отладка

Проверяйте статус служб с помощью systemctl status, а также логи с помощью journalctl. Это поможет диагностировать любые проблемы, связанные с запуском и функционированием ваших сервисов.

7. параметр Type в unit-файле

В Systemd, параметр Type в unit-файле службы определяет, как systemd будет управлять процессом и что он будет считать «успешным» запуском службы. Он указывает на то, как служба должна работать и взаимодействовать с системой. Вот несколько значений для опции Type:

Основные типы Type:

  1. Type=simple (по умолчанию):
    • Это тип по умолчанию, если опция Type не указана.
    • Systemd считает, что процесс сервиса сразу считается успешно запущенным после его старта.
    • Команда в ExecStart запускается, и systemd не ожидает каких-либо дополнительных сигналов или событий, подтверждающих успешный запуск.
    • Пример использования: для сервисов, которые сразу начинают свою работу, как фоновый процесс, например, скрипты или простые демоны.
       
  2. Type=forking:
    • Служба запускается как процесс, который форкается (создаёт дочерний процесс).
    • Система будет считать службу запущенной, когда процесс форка завершится.
    • Это типично для традиционных демонов, которые при запуске создают дочерний процесс, а родительский завершает работу.
    • Пример использования: для служб, которые «демонизируются» — то есть создают процесс в фоновом режиме и завершают родительский процесс.
       
  3. Type=oneshot:
    • Служба, которая выполняет одну операцию и завершает работу. Используется для служб, которые выполняют краткосрочные задачи и завершатся самостоятельно.
    • Systemd будет ждать завершения процесса и считать его успешным только после завершения.
    • Часто используется для скриптов или задач, таких как настройки среды или миграции базы данных.
       
    • Опция RemainAfterExit=yes сохраняет статус службы как «активный», даже после завершения выполнения команды.
  4. Type=notify:
    • Служба использует systemd API для уведомления системы о том, что она успешно запустилась. Пока это уведомление не поступит, служба не будет считаться запущенной.
    • Требует поддержки протокола sd_notify в коде самой службы.
    • Подходит для более сложных сервисов, которые должны пройти инициализацию перед тем, как сообщить, что готовы к работе.
       
  5. Type=dbus:
    • Служба запускается и считается активной, когда регистрируется в D-Bus. Применяется для служб, которые взаимодействуют через D-Bus (например, для десктопных окружений).
       
  6. Type=idle:
    • Команда будет выполняться только после завершения других задач и инициализации системы. То есть сервис будет запускаться в «холостом» режиме, дожидаясь подходящего времени для старта.
       

Выбор типа службы важен для правильного функционирования сервисов в systemd, так как он определяет, когда systemd считает процесс запущенным и как его нужно отслеживать. В зависимости от того, является ли сервис фоновым процессом, скриптом или сложным сервисом с уведомлениями, нужно использовать соответствующий тип Type.

Заключение

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *