Это не черная магия, но достаточно близко

В последнее время я связался с несколькими компаниями, чтобы спросить, не ищут ли они новых стажеров этим летом. Я еще не получил степень CS, но я хочу почувствовать реальный мир за пределами университета. Одна из этих компаний попросила меня создать и развернуть небольшой RESTful API.

Создать API было достаточно просто - ничего, с чем не смог бы справиться амбициозный студент. Закончив полировку конечного продукта, я загрузил исходный код своего API через SFPT на сервер, где хотел его развернуть. Затем я SSH сказал сервер и запустил API, и это сработало! Но как только я вышел из сервера, API остановился. Я не мог поддерживать сеанс SSH с сервером 24 часа в сутки, пока компания не проверила мой API. Мне нужен был API для автономной работы на сервере.

Мне нужно было высвободить демона.

Хотя высвобождение демона звучит фантастично и захватывающе, я с сожалением должен вам сообщить, что на самом деле это совсем наоборот. Демоны (или службы), с которыми мы собираемся бороться здесь, - это просто фоновые процессы, которые запускаются сами по себе без взаимодействия с пользователем. Однако я не преувеличу, если скажу, что почувствовал себя убийцей демонов, когда мой API работал в фоновом режиме.

Если не считать шуток, создание демона - довольно простая задача, если вы знаете, что делаете. Пойдем прямо к делу!

Создание Сервиса

Все службы расположены в /etc/systemd/system, так как они зависят от библиотек, предлагаемых systemd для правильной работы. Чтобы создать службу, мы должны создать файл .service в этом каталоге, что можно сделать с помощью этой команды:

$ sudo nano /etc/systemd/system/mydaemon.service

mydaemon должно быть именем вашего демона. Теперь давайте заполним файл .service следующим:

[Unit]
Description=My first daemon!
[Service]
User=<yourUser>
#Code to execute
#Can be the path to an executable or code itself
WorkingDirectory=/home/ubuntu/mydaemon
ExecStart=/home/ubuntu/mydaemon/executable
Type=simple
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

Не забудьте изменить <yourUser> на фактического пользователя на вашем сервере! Обратите внимание, как WorkingDirectory и ExecStart указывают на одну и ту же папку. Он должен оставаться таким, чтобы ваша служба работала правильно. В настоящий момент этого каталога не существует. Давайте создадим это!

Создание сценария Bash для службы

Во-первых, давайте создадим каталог для нашего исполняемого файла. Это каталог, указанный в WorkingDirectory:

$ mkdir mydaemon

Теперь войдем в каталог и создадим наш исполняемый файл!

$ cd mydaemon
$ sudo nano executable

Исполняемый файл должен содержать следующий заголовок:

#!/bin/sh

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

#!/bin/sh
java -jar myAppi.jar

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

$ sudo chmod 005 executable

Теперь осталось только вызвать нашего Демона!

Запуск службы

В отличие от вызова настоящего демона, это можно легко сделать с помощью следующих команд:

$ sudo systemctl daemon-reload
$ sudo systemctl enable mydaemon
$ sudo systemctl start  mydaemon

И после этого ваш сервис должен быть запущен! Вы можете проверить статус вашей службы с помощью:

$ sudo systemctl status mydaemon

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

$ sudo journalctl --unit=mydaemon

Последние мысли

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

Удачного вызова!

Спасибо за чтение.