файл единицы systemd обрабатывает по шаблону для многочисленных пользователей

Я отправил этот ответ на свой вопрос когда-то назад. Теперь, из-за развития потребностей, я хотел бы сделать сервер VNC доступным для многочисленных пользователей. Сервис должен запуститься при запуске и быть доступным.

Я пытался передать различные аргументы User= директива (под [Service] раздел). Я попробовал User=$USER, User=%u, и немного других альтернатив. Ни один не работал. На документацию, User должно быть унитарное и статическое. Однако документация также упоминает a DynamicUser чуть ниже User= директива, которая является, к сожалению, вне моего понимания systemd. (Возможно, я должен попробовать User=$USER или User=%u и DynamicUser=true? Не работает.)

Есть ли способ создать a systemd шаблонный файл единицы для многочисленных пользователей?


Ps. Кажется, что это могло быть сделано с более старым init.d

1
задан 9 March 2018 в 10:37

1 ответ

Не возможно передать несколько параметров шаблон systemd (см. связанное обсуждение списка рассылки). Однако, так как у нас есть только два параметра, и каждый - имя пользователя, имеет смысл делать это пользовательским сервисом вместо системной службы.

Пользовательские сервисы могут быть выполнены при начальной загрузке, если Вы позволяете задержаться для тех пользователей:

sudo loginctl enable-linger username

От man loginctl:

enable-linger [USER...], disable-linger [USER...]
   Enable/disable user lingering for one or more users. If enabled for
   a specific user, a user manager is spawned for the user at boot and
   kept around after logouts. This allows users who are not logged in
   to run long-running services. Takes one or more user names or
   numeric UIDs as argument. If no argument is specified,
   enables/disables lingering for the user of the session of the
   caller.

Можно создать пользовательский сервис в /etc/systemd/user, который был бы похож (адаптация Вашего более раннего сервиса):

[Unit]
Description=Start TigerVNC Server at startup
After=syslog.target network.target

[Service]
Type=forking
PAMName=login
PIDFile=%h/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver :%i -depth 24 -geometry 1920x1080 -nolisten tcp -localhost
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=default.target

Используйте %h спецификатор для пользовательского корневого каталога. Я опустил User= поле, которое не имеет смысла на сеансах пользователя. Также обратите внимание на изменения к WantedBy в [Install] от multi-user.target (который не существует на сеансах пользователя) к default.target.

Пользователи могут затем управлять этим сервисным использованием systemctl --user команды. (Обратите внимание, что Вы, возможно, должны были бы перезапустить после включения задерживаются, если тот пользователь еще не вошел в систему, так, чтобы сеанс пользователя был запущен для них.)

2
ответ дан 7 December 2019 в 13:26

Другие вопросы по тегам:

Похожие вопросы: