Помощь:
man systemd.unit
man systemd.service
man systemd.exec
man systemctl
man sysusers.d
man systemd-sysusers
/usr/lib/systemd/system/ – юниты из установленных пакетов RPM — всякие nginx, apache, mysql и прочее
/run/systemd/system/ — юниты, созданные в рантайме — тоже, наверное, нужная штука
/etc/systemd/system/ — юниты, созданные системным администратором — а вот сюда мы и положим свой юнит.
Юнит представляет из себя текстовый файл с форматом, похожим на файлы .ini Microsoft Windows.
/etc/systemd/system/NAME-UNIT.service - расположение юнита NAME-UNIT
/etc/sysusers.d/NAME-UNIT.conf - расположение конфига NAME-UNIT (не обязательный файл)
Пример простого юнита MyUnit:
vim /etc/systemd/system/myunit.service
-----------------------------------------
[Unit]
#описание юнита
Description=MyUnit
#Запускать юнит после какого-либо сервиса или группы сервисов
After=syslog.target
After=network.target
After=nginx.service
After=mysql.service
#Для запуска сервиса необходим запущенный сервис mysql
Requires=mysql.service
#Для запуска сервиса желателен запущенный сервис redis
Wants=redis.service
[Service]
#Тип сервиса (Type=simple, Type=forking)
Type=forking
#Определить PIDFile=, чтобы systemd могла отслеживать основной процесс (не обязательный)
PIDFile=/work/www/myunit/shared/tmp/pids/service.pid
#Рабочий каталог, он делается текущим перед запуском стартап команд (не обязательный)
WorkingDirectory=/work/www/myunit/current
#Пользователь и группа, под которым надо стартовать сервис:
User=myunit
Group=myunit
#Переменные окружения (не обязательный)
Environment=RACK_ENV=production
#логи
SyslogIdentifier=MyUnit
SyslogFacility=daemon
#Запрет на убийство сервиса вследствие нехватки памяти и срабатывания механизма OOM
OOMScoreAdjust=-1000
#Команды на старт/стоп и перезапуск сервиса
ExecStart=/usr/local/bin/bundle exec service -C /work/www/myunit/shared/config/service.rb --daemon
ExecStop=/usr/local/bin/bundle exec service -S /work/www/myunit/shared/tmp/pids/service.state stop
ExecReload=/usr/local/bin/bundle exec service -S /work/www/myunit/shared/tmp/pids/service.state restart
#Таймаут в секундах, сколько ждать system отработки старт/стоп команд
TimeoutSec=300
#Попросим systemd автоматически рестартовать наш сервис, если он вдруг перестанет работать
Restart=always
RestartSec=5
Restart=on-failure
[Install]
#В секции [Install] опишем, в каком уровне запуска должен стартовать сервис
WantedBy=multi-user.target
-----------------------------------------
Директива Type= может быть одной из следующих:
Type=simple
Основной процесс службы указан в стартовой строке.
Это значение по умолчанию, если директивы Type= и Busname= не установлены, но установлен ExecStart=.
Любое сообщение должно обрабатываться вне устройства через второй блок соответствующего типа (например, через блок .socket, если эта служба должна обмениваться данными с помощью сокетов).
Type=forking
Этот тип службы используется, когда служба форкает дочерние процессы при мгновенном покидании родительского процесса.
Это сообщает systemd, что процесс все еще работает, даже несмотря на то, что родитель завершил сеанс.
Хорошо подходит, например для запуска php-fpm, nginx, tomcat.
Type=oneshot
Этот тип указывает, что процесс будет недолговечным и система должна ждать завершения процесса, прежде чем продолжить работу с другими устройствами.
Значение по умолчанию для Type= и ExecStart= не установлены.
Он используется для одноразовых задач.
Type=dbus
Это означает, что устройство будет использовать имя от D-Bus шины.
Когда это произойдет, systemd продолжит обработку следующего блока.
Type=notify
Это указывает на то, что служба отправит уведомление, когда закончит запуск.
Процесс systemd будет ждать, пока это произойдет, прежде чем переходить к другим устройствам.
Type=idle
Это означает, что служба не будет запущена до тех пор, пока не будут отправлены все задания.
multi-user.target или runlevel3.target соответствует нашему привычному runlevel=3"Многопользовательский режим без графики".
Пользователи, как правило, входят в систему при помощи множества консолей или через сеть
После изменения\добавления файла юнита необходимо:
systemctl daemon-reload - перечитать демоны
systemctl enable NAME-UNIT - добавить в автозагрузку
systemctl start NAME-UNIT - запустить
systemctl -l status NAME-UNIT - проверить
systemctl --state=failed - показать сбойные юниты