systemd ubuntu или автозагрузка скриптов и демонов

  • Основные команды управления systemd:

Добавить в автозагрузку:

systemctl enable pptpd

Удалить из автозагрузки:

ystemctl disable pptpd

Проверить есть ли в автозагрузке сервис:

systemctl is-enabled httpd

Какие сервисы добавлены в автозагрузку:

systemctl list-unit-files | grep enabled

  • Тонкая настройка systemctl:

Для начала нужно убедиться, что ваш дистрибутив работает с Systemd, командой:

readlink /proc/1/exe

если вывод будет /sbin/init - то у вас используется SysV.

Если вывод такой:

/lib/systemd/systemd - то все в порядке, у вас Systemd.

Systemd осуществляет свою работу с помощью так называемых юнитов systemd.

Юнит (Unit) - это конфигурационный файл, расположенный в одной из директорий:

/run/systemd/system/ — юниты, созданные в рантайме. Этот каталог приоритетнее каталога с установленными юнитами из пакетов.

/etc/systemd/system/ — юниты, созданные и управляемые системным администратором. Этот каталог приоритетнее каталога юнитов, созданных в рантайме. В этом каталоге мы и будем создавать свой юнит.

  • Мой рабочий пример для iptables
nano /lib/systemd/system/iptables.service

[Unit]

Description=My Script Iptables

After=network.target

[Service]

Type=simple

ExecStart=/bin/bash -c /root/scripts/iptables.sh

[Install]

WantedBy=multi-user.target

chmod 644 /lib/systemd/system/iptables.service

systemctl daemon-reload

systemctl enble iptables.service

reboot

  • Первый пример

Переходим в каталог /etc/systemd/system/ и создаем в нем, либо копируем какой-либо существующий файл, к примеру sshd.service, и в нем пишем:

nano /etc/systemd/system/sshd.service

[Unit]

Description=MyBashScript

After=syslog.target

[Service]

ExecStart=/bin/bash '/home/user/scripts/script.sh'
Type=forking

[Install]

WantedBy=multi-user.target
Alias=bash.service

Секция [Unit]:

Содержит общую информацию о сервисе, его описание, и то, что он должен стартовать после запущенного демона Syslog.

Секция [Service]:

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

Type=forking означает, что запускаемый скрипт будет работать в режиме демона. Если мы хотим, чтобы скрипт выполнился один раз, то указываем Type=simple.

Секция [Install]:

Последняя секция [Install] содержит информацию о цели, в которой сервис должен стартовать. В данном случае мы хотим, что сервис должен быть запущен, когда будет активирована цель multi–user.target (это аналог init 3 в SysV).

Alias=bash.service - для удобства создадим алиас, чтобы проще управлять нашим сервисом через systemctl.

Сохраняем файл, и выполняем команду

systemctl daemon-reload

Запускаем наш новый сервис:

systemctl start bash.service
  • Второй пример:

[Unit]

Description=MyUnit

After=syslog.target

After=network.target

[Service]

Type=forking

PIDFile=/run/service.pid

WorkingDirectory=/usr/local/service

User=munit

Group=unit

OOMScoreAdjust=-100

ExecStart=/usr/sbin/service

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

TimeoutSec=300

[Install]

WantedBy=multi-user.target

В простом варианте юнит состоит из трех секции:

[Unit], [Service], [Install].

Секция [Unit]

Описание юнита:

Description=MyUnit

Далее указываем порядок загрузки, после какого сервиса systemd запустить наш юнит:

After=syslog.target

After=network.target

Секция [Service]

Задаем тип сервиса:

Type=simple

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

Type=forking

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

Расположение pid-файла:

PIDFile=/run/service.pid

Рабочий каталог приложения:

WorkingDirectory=/usr/local/service

Пользователь и группа, под которым будет запускаться сервис:

User=unit

Group=unit

Задаем приоритет убийства процесса при нехватке памяти:

OOMScoreAdjust=-100

Минимальное значение -1000 — полный запрет.

Команды запуска, остановки и перезапуска сервиса:

ExecStart=/usr/sbin/service

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

Таймаут запуска или остановки сервиса:

TimeoutSec=300

Контроль запуска сервиса и автоматический запуск в случае крєша:

Restart=always

Секция [Install]

Уровень запуска сервиса:

WantedBy=multi-user.target

  • Ну и еще один постенький пимер мой

https://onedayadmin.sytes.net/noip-domennoe-imya-na-dinamicheskom-ip/

Ниже представлены основные команды systemctl:

systemctl start name.service

– запуск сервиса.
systemctl stop name.service — остановка сервиса
systemctl restart name.service — перезапуск сервиса
systemctl try-restart name.service — перезапуск сервиса только, если он запущен
systemctl reload name.service — перезагрузка конфигурации сервиса
systemctl status name.service — проверка, запущен ли сервис с детальным выводом состояния сервиса
systemctl is-active name.service — проверка, запущен ли сервис с простым ответом: active или inactive
systemctl list-units --type service --all – отображение статуса всех сервисов
systemctl enable name.service – активирует сервис (позволяет стартовать во время запуска системы)
systemctl disable name.service – деактивирует сервис
systemctl reenable name.service – деактивирует сервис и сразу активирует его
systemctl is–enabled name.service – проверяет, активирован ли сервис
systemctl list-unit-files --type service – отображает все сервисы и проверяет, какие из них активированы
systemctl mask name.service – заменяет файл сервиса симлинком на /dev/null, делая юнит недоступным для systemd
systemctl unmask name.service – возвращает файл сервиса, делая юнит доступным для systemd

Источники:

http://freecoder.ru/content/zapusk-bash-skripta-v-fonovom-rezhime-cherez-systemd

https://codebeer.ru/dobavit-servis-v-systemd/

https://forum.ubuntu.ru/index.php?topic=300127.0