Systemd создание сервисов в Ubuntu
Создание сервисов с помощью Systemd на Ubuntu позволяет вам управлять процессами и программами в операционной системе в качестве служб, автоматически запускать их при старте системы и управлять их состояниями (запуск, остановка, перезапуск). Вот как это можно сделать.
1. Создание файла службы (Unit File)
Файлы служб в systemd создаются с расширением .service
и обычно хранятся в директории /etc/systemd/system/
.
Пример: создание простого сервиса
Шаги:
- Создайте файл службы, например,
/etc/systemd/system/my_service.service
. - Напишите следующий контент для службы:
123456789101112[Unit]Description=My Custom ServiceAfter=network.target[Service]ExecStart=/usr/bin/my_script.shRestart=on-failureUser=myuser[Install]WantedBy=multi-user.target- [Unit]: Описывает сам сервис, его описание, зависимости (например,
After=network.target
означает, что сервис запустится после сети). - [Service]: Основная часть, которая указывает команду для выполнения (
ExecStart
), как перезапускать службу (Restart=on-failure
), от какого пользователя запускать (User=myuser
). - [Install]: Определяет, при каких условиях сервис должен быть активен при загрузке системы.
- [Unit]: Описывает сам сервис, его описание, зависимости (например,
2. Загрузка и запуск сервиса
После того как вы создали файл службы, необходимо выполнить следующие команды:
- Перезагрузите конфигурации systemd, чтобы он распознал новый сервис:
1sudo systemctl daemon-reload
- Запустите сервис вручную:
12sudo systemctl start my_service
- Включите автоматический запуск сервиса при старте системы:
1sudo systemctl enable my_service
- Проверьте статус сервиса:
12sudo systemctl status my_service
- Остановить сервис можно командой:
12sudo systemctl stop my_service
3. Основные опции systemd для сервисов
- ExecStart: Команда для запуска службы.
- ExecStop: Команда для остановки службы.
- Restart=on-failure: Перезапуск сервиса при сбоях.
- User=: Под каким пользователем запустить сервис.
- Environment=: Определяет переменные окружения для запуска службы.
4. Логи и отладка
Systemd использует утилиту journalctl для управления логами сервисов.
- Посмотреть логи для конкретного сервиса:
12sudo journalctl -u my_service - Отфильтровать логи по времени:
12sudo journalctl -u my_service --since "2024-09-01"
5. Пример: служба для веб-сервера
Если вы хотите создать службу для веб-сервера на основе Python:
- Скрипт
/usr/local/bin/web_server.py
:
123456from http.server import HTTPServer, SimpleHTTPRequestHandlerserver = HTTPServer(('0.0.0.0', 8000), SimpleHTTPRequestHandler)print("Server started at http://0.0.0.0:8000")server.serve_forever() - Unit-файл
/etc/systemd/system/web_server.service
:
1234567891011[Unit]Description=Simple Web Server[Service]ExecStart=/usr/bin/python3 /usr/local/bin/web_server.pyRestart=alwaysUser=www-data[Install]WantedBy=multi-user.target - Перезагрузите systemd, запустите и включите службу:
1234sudo systemctl daemon-reloadsudo systemctl start web_serversudo systemctl enable web_server
Теперь веб-сервер будет автоматически стартовать при запуске системы.
6. Проверка и отладка
Проверяйте статус служб с помощью systemctl status
, а также логи с помощью journalctl
. Это поможет диагностировать любые проблемы, связанные с запуском и функционированием ваших сервисов.
7. параметр Type
в unit-файле
В Systemd, параметр Type
в unit-файле службы определяет, как systemd будет управлять процессом и что он будет считать «успешным» запуском службы. Он указывает на то, как служба должна работать и взаимодействовать с системой. Вот несколько значений для опции Type
:
Основные типы Type
:
Type=simple
(по умолчанию):- Это тип по умолчанию, если опция
Type
не указана. - Systemd считает, что процесс сервиса сразу считается успешно запущенным после его старта.
- Команда в
ExecStart
запускается, и systemd не ожидает каких-либо дополнительных сигналов или событий, подтверждающих успешный запуск. - Пример использования: для сервисов, которые сразу начинают свою работу, как фоновый процесс, например, скрипты или простые демоны.
1234[Service]Type=simpleExecStart=/usr/bin/my_service.sh
- Это тип по умолчанию, если опция
Type=forking
:- Служба запускается как процесс, который форкается (создаёт дочерний процесс).
- Система будет считать службу запущенной, когда процесс форка завершится.
- Это типично для традиционных демонов, которые при запуске создают дочерний процесс, а родительский завершает работу.
- Пример использования: для служб, которые «демонизируются» — то есть создают процесс в фоновом режиме и завершают родительский процесс.
1234[Service]Type=forkingExecStart=/usr/sbin/my_daemon --daemonize
Type=oneshot
:- Служба, которая выполняет одну операцию и завершает работу. Используется для служб, которые выполняют краткосрочные задачи и завершатся самостоятельно.
- Systemd будет ждать завершения процесса и считать его успешным только после завершения.
- Часто используется для скриптов или задач, таких как настройки среды или миграции базы данных.
12345[Service]Type=oneshotExecStart=/usr/bin/short_task.shRemainAfterExit=yes - Опция
RemainAfterExit=yes
сохраняет статус службы как «активный», даже после завершения выполнения команды.
Type=notify
:- Служба использует systemd API для уведомления системы о том, что она успешно запустилась. Пока это уведомление не поступит, служба не будет считаться запущенной.
- Требует поддержки протокола sd_notify в коде самой службы.
- Подходит для более сложных сервисов, которые должны пройти инициализацию перед тем, как сообщить, что готовы к работе.
1234[Service]Type=notifyExecStart=/usr/bin/my_advanced_service
Type=dbus
:- Служба запускается и считается активной, когда регистрируется в D-Bus. Применяется для служб, которые взаимодействуют через D-Bus (например, для десктопных окружений).
12345[Service]Type=dbusBusName=com.example.my_serviceExecStart=/usr/bin/my_dbus_service
- Служба запускается и считается активной, когда регистрируется в D-Bus. Применяется для служб, которые взаимодействуют через D-Bus (например, для десктопных окружений).
Type=idle
:- Команда будет выполняться только после завершения других задач и инициализации системы. То есть сервис будет запускаться в «холостом» режиме, дожидаясь подходящего времени для старта.
1234[Service]Type=idleExecStart=/usr/bin/my_idle_service.sh
- Команда будет выполняться только после завершения других задач и инициализации системы. То есть сервис будет запускаться в «холостом» режиме, дожидаясь подходящего времени для старта.
Выбор типа службы важен для правильного функционирования сервисов в systemd, так как он определяет, когда systemd считает процесс запущенным и как его нужно отслеживать. В зависимости от того, является ли сервис фоновым процессом, скриптом или сложным сервисом с уведомлениями, нужно использовать соответствующий тип Type
.
Заключение
Создание служб через Systemd дает вам полный контроль над программами, которые работают в системе, их запуском, остановкой и перезапуском, а также возможностью автоматически запускать их при старте системы.
Recommended Posts
jq — инструмент для обработки JSON-данных
28.02.2024
Ansible, как перезапустить службу systemd?
10.03.2023