systemd

файл модуля systemd, создающий службу

файл модуля systemd, создающий службу
Управление услугами - это то, о чем вы даже не думаете, когда используете свою рабочую станцию ​​Linux или сервер Linux каждый день, но когда его нет, вы действительно возненавидите его. Когда вы создаете, например, новую серверную программу, которая должна работать круглосуточно и без выходных, выполнение этой задачи без управления услугами становится кошмаром, когда вы фактически создаете небольшую систему обслуживания самостоятельно, которая, очевидно, будет не так хороша, как менеджер, разработанный специалистом. полная команда в течение многих лет, так или иначе.

Благодаря своим сервисам systemd делает все это проще, действительно проще. Если вы хотите, чтобы что-то отслеживало ваше приложение и легко им управляло, systemd - это то, что вам нужно, и это то, что я собираюсь объяснить здесь!

Где находятся службы Systemd

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

Точное местоположение зависит от того, почему и как была установлена ​​служба. Если служба установлена ​​менеджером пакетов, она обычно находится в / usr / lib / systemd / system. Для программного обеспечения, которое вы разрабатываете, или программного обеспечения, которое не поддерживает systemd сама по себе, вы поместите служебный файл в / usr / local / lib / systemd / system. Однако имейте в виду, что некоторые дистрибутивы не поддерживают эту папку в / usr / local. Наконец, если вы хотите настроить существующую службу systemd, используйте / etc / systemd / system.

Внутри этих папок вы можете найти несколько расширений файлов, например *.разъем, *.цель или *.услуга. Очевидно, мы собираемся сосредоточиться на последнем. systemd использует имя файла в качестве имени службы при ее запуске или остановке и т. д. Таким образом, обычно имена файлов в сервисе содержат только буквенно-цифровые символы вместе с дефисами и символами подчеркивания. Во время разработки я рекомендую создать его в своих документах, а затем скопировать в папку systemd, когда это будет сделано, чтобы избежать проблем, если вы сохраните в середине редактирования.

Хорошо, пожалуйста, создайте свой служебный файл в своих документах. Теперь мы готовы рассмотреть, как записать этот файл.
[Примечание: см. Отчет о потенциальной ошибке в разделе комментариев этого сообщения в блоге]

[Ед. изм]
Описание = HTTP-сервер веб-приложения Penguins (работает через порт 8080)
WantedBy = многопользовательский.цель
 
[Услуга]
Тип = простой
ExecStart = / usr / bin / python3 / usr / local / bin / penguin-web-app / main.ру
Перезагрузка = всегда

Формат файла по сути близок к ini. Я знаю, что это может быть странно, учитывая, что ini-файлы часто встречаются в Windows, но вот как это работает. Сервисный файл сначала делится на 2 раздела: [Unit] и [Service]. Каждый раздел настраивает определенный аспект systemd: [Unit] содержит элементы, общие для всех файлов systemd unit, в то время как [Service] предназначен только для конфигурации, специфичной для настройки новой службы.

Затем в разделе настраиваются такие свойства, как Description = или ExecStart =. Значение отделяется от имени свойства знаком равенства = без пробелов.

Вернемся к показанному выше файлу. Он описывает службу, предназначенную для запуска веб-приложения, написанного на Python, о пингвинах. systemd перезапустит его всякий раз, когда процесс завершится, и запустит сервер при запуске сервера, если вы включите его с помощью команды systemctl enable. Круто а?

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

Свойства служб Systemd

Давайте сначала сосредоточимся на свойствах в [Unit]:

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

WantedBy = позволяет сказать systemd: когда эта вещь запускается, запускает и меня. Обычно вы указываете имя цели. Примеры общих целей:

  1. многопользовательский.цель: когда сервер в порядке и готов к запуску приложений командной строки
  2. графический.цель: когда GNOME или KDE готовы
  3. сеть.цель: когда сервер правильно подключен к сети

ОК для начала этих свойств [Unit] достаточно. Давайте посмотрим на [Сервис] сейчас.

Type = помогает systemd узнать, запущена ли служба. Вот общие типы:

  1. simple, вероятно, наиболее часто используется: systemd считает процесс, который вы запускаете, как тот, который выполняет службу. Если процесс останавливается, он также считает, что служба остановлена ​​и т. Д.
  2. разветвление предпочтительнее для приложений, которые были написаны как сервер, но без помощи системы управления услугами. В основном он ожидает, что запущенный процесс будет разветвлен, и этот разветвление считается последним процессом для службы. Чтобы быть более точным, вы также можете помочь systemd с файлом PID, где PID отслеживаемого процесса записывается запущенным приложением.

ExecStart =, вероятно, самый важный для службы: он определяет, какое приложение запускать при запуске службы. Как вы можете видеть в сервисе Penguin, я сразу использовал / usr / bin / python3, а не python3. Это потому, что документация systemd явно рекомендует использовать абсолютные пути, чтобы избежать каких-либо сюрпризов.

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

ExecStart = / usr / bin / bash / usr / local / bin / launch-penguin-server.ш

Не так уж и сложно? Обратите внимание, что если вам нужно запустить какой-либо процесс, чтобы сигнализировать о правильной остановке службы, ExecStop = существует, а также ExecReload = для перезагрузки служб.

Restart = позволяет вам явно указать, когда следует перезапустить службу. Это одна из важных функций systemd: она гарантирует, что ваш сервис будет работать столько, сколько вы захотите, поэтому обратите особое внимание на эту опцию.

Перезагрузка = Имея в виду
всегда systemd будет перезапускать его всякий раз, когда он завершится или выйдет из строя. Ну, пока вы не выполните systemctl stop service-name.услуга.

Он идеально подходит для серверов и онлайн-сервисов, поскольку вы предпочитаете несколько бесполезных перезапусков, а не перезапускать сервис вручную без какой-либо причины.

ненормальный Когда сервисный процесс выйдет из строя, перезапустите сервис. Однако, если приложение завершает работу без ошибок, не перезапускайте его.

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

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

Обычно полезно для доступа к другим функциям systemd, таким как ведение журнала без функции перезапуска.

WorkingDirectory = может принудительно использовать рабочий каталог при запуске вашего приложения. Значение должно быть абсолютным путем к каталогу. Рабочий каталог используется, когда вы используете относительные пути в коде вашего приложения. Для нашей службы пингвинов это могут быть:

Рабочий каталог = / SRV / пингвин-веб-приложение /

Затем безопасность важна, поэтому вы обычно не хотите запускать свою службу с привилегиями root. User = and Group = позволяет вам установить имя пользователя или группы или UID / GID, под которым будет запускаться ваше приложение. Например:

Пользователь = penguin-web
Группа = пингвин-паутина

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

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

Синтаксис этого файла прост: вы вводите имя переменной среды, знак равенства =, а затем ее значение. Затем вы помещаете абсолютный путь к вашему файлу среды в свойство EnvironmentFile.

Итак, пример:

EnvironmentFile = / и т.д. / пингвин-веб-приложение / среда

А файл / etc / penguin-web-app / environment содержит:

LISTEN_PORT = 8080

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

Сохраните и запустите недавно созданную службу Systemd

Итак, если вы последовали моему совету, вы отредактировали свой служебный файл в своем домашнем каталоге. Как только вы будете удовлетворены, скопируйте этот файл в / usr / local / lib / systemd / system, если ваш дистрибутив поддерживает этот путь. Имя вашего служебного файла будет его служебным именем. Это имя файла должно заканчиваться на .услуга. Например, для нашего сервера пингвинов это будет пингвин-веб-приложение.услуга.

Затем вы должны сообщить systemd, что добавили новую службу, поэтому вам нужно ввести эту команду:

$ sudo systemctl демон-перезагрузка

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

Теперь пора запустить службу:

$ sudo systemctl запустить пингвин-веб-приложение.услуга

Если это не удается с ошибкой «Блок не найден», такой как эта:

$ sudo systemctl запустить пингвин-веб-приложение.услуга
Не удалось запустить приложение-пингвин.услуга: Единица не найдена.

Это означает, что ваш дистрибутив не поддерживает каталог или вы неправильно назвали свой служебный файл. Обязательно проверьте.

Если вы настроили свою службу с помощью WantedBy = и хотите, чтобы ваша служба запускалась автоматически, вы должны включить ее с помощью этой команды:

$ sudo systemctl включить пингвин-веб-приложение.услуга

Самое классное в сервисе - это то, что он работает в фоновом режиме. Проблема: как узнать, работает ли он правильно и работает ли он в фоновом режиме? Не волнуйтесь, команда systemd тоже подумала об этом и предоставила команду, чтобы проверить, правильно ли она работает, сколько времени и т. Д .:

$ systemctl status penguin-web-app.услуга

Заключение

поздравляю! Теперь вы можете управлять своими приложениями, не беспокоясь о перезапуске каждый раз вручную. Теперь я рекомендую вам прочитать другую нашу статью о журналах systemd: Master journalctl: понять журналы systemd. Благодаря этому вы можете использовать мощную систему ведения журналов в своем новом сервисе и создавать более надежные серверы!

Как изменить левую и правую кнопки мыши на ПК с Windows 10
Совершенно нормально, что все устройства компьютерной мыши эргономичны для правшей. Но есть мышиные устройства, специально разработанные для левшей ил...
Эмуляция щелчков мыши с помощью мыши без щелчка в Windows 10
Использование мыши или клавиатуры в неправильной позе или чрезмерное использование может привести к множеству проблем со здоровьем, включая растяжение...
Добавьте жесты мыши в Windows 10 с помощью этих бесплатных инструментов
В последние годы компьютеры и операционные системы сильно эволюционировали. Было время, когда пользователям приходилось использовать команды для навиг...