Systemd – это современный инит и замена rc в стиле SysV для систем Linux, которая использует многие современные функции ядра Linux.
Он предоставляет диспетчер системы и услуг, который запускается как PID 1 и запускает остальную часть системы.
Systemd отвечает за управление тем, как службы запускаются, останавливаются, перезапускаются и каким-либо другим образом управляются в современных дистрибутивах Linux.
Стандартные файлы модулей Systemd , которые поставляются с системой Linux или устанавливаются сторонними приложениями, обычно запускаются от имени пользователя root или системного пользователя.
Это руководство покажет вам, как запустить службу Systemd без рута от обычного пользователя, вошедшего в систему.
Юнит службы Systemd
Файл модуля Systemd содержит директивы конфигурации, которые описывают модуль и определяют его поведение.
В этом руководстве мы напишем файл модуля systemd, которым может управлять зарегистрированный пользователь без sudo.
Запустим службу Systemd от стандартного пользователя
Пользовательский сервис Systemd должен быть помещен в каталог ~/.config/systemd/user , если вы хотите иметь полное право владения обычным пользователем.
Создайте его, если его не существует.
mkdir -p ~/.config/systemd/user/
Мы создадим тестовый сервис, который запускает приложение Syncthing.
curl -s https://api.github.com/repos/syncthing/syncthing/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi -
tar xvf syncthing-linux-amd64*.tar.gz
sudo cp syncthing-linux-amd64-*/syncthing /usr/local/bin/
Давайте подтвердим, что наш бинарник приложения доступен.
$ syncthing --version
syncthing v1.4.0 "Fermium Flea" (go1.13.8 linux-amd64) teamcity@build.syncthing.net 2020-03-06 19:52:22 UTC
Создайте файл системного юнита в каталоге.
$ vim ~/.config/systemd/user/syncthing.service
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization
Documentation=man:syncthing(1)
[Service]
ExecStart=/usr/local/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4
# Hardening
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true
[Install]
WantedBy=default.target
Перезагрузите systemd.
$ systemctl --user daemon-reload
Подтвердите, что служба доступна.
$ systemctl --user list-unit-files syncthing.service
UNIT FILE STATE
syncthing.service disabled
1 unit files listed.
Вы можете запустить службу сразу после создания.
$ systemctl --user enable --now syncthing.service
Created symlink /home/vagrant/.config/systemd/user/default.target.wants/syncthing.service → /home/vagrant/.config/systemd/user/syncthing.service.
Давайте проверим состояние нашего сервиса.
$ systemctl --user status syncthing.service
● syncthing.service - Syncthing - Open Source Continuous File Synchronization
Loaded: loaded (/home/vagrant/.config/systemd/user/syncthing.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-04-03 17:18:54 UTC; 5s ago
Docs: man:syncthing(1)
Main PID: 22628 (syncthing)
CGroup: /user.slice/user-1000.slice/user@1000.service/syncthing.service
├─22628 /usr/local/bin/syncthing -no-browser -no-restart -logflags=0
└─22632 /usr/local/bin/syncthing -no-browser -no-restart -logflags=0
Используемая опция:
- –user
Это тот же процесс, который вы можете использовать для создания любой другой службы Systemd, которой хотите управлять без повышения привилегий или создания другого системного пользователя для запуска службы.
А как автозапуск сделать с правами user и что бы юзер мог управлять службой без прав sudo?
USER ALL = NOPASSWD: /usr/sbin/service
Получается что установленные сервисы через –user настроить на автозапуск нельзя ?Получается нужно установить сервис в раздел /etc/system/systemd, для возможности автозапуска, дать права в /etc/sudoers USER ALL = NOPASSWD: /usr/sbin/service что бы не просил пароль?
Вообще можно. Можно сделать системный юнит, где указать пользователя и сделать скрипт запуска от пользователя. Но это больше трудозатрат
Ну я так и собирался делать. Другого варианта не вижу.
Так каков вопрос? Чем могу подскажу