systemd modelo de arquivo de unidade para vários usuários

1

Eu havia postado esta resposta à minha pergunta há algum tempo. Agora, devido às necessidades em evolução, gostaria de disponibilizar o servidor VNC para vários usuários. O serviço deve começar na inicialização e estar disponível.

Eu tentei passar vários argumentos para a diretiva User= (na seção [Service] ). Eu tentei User=$USER , User=%u e algumas outras alternativas. Nenhum funcionou. Por documentação , User deve ser unitário e estático. No entanto, a documentação também menciona um DynamicUser logo abaixo da diretiva User= , que infelizmente está além do meu entendimento de systemd . ( Talvez eu devesse tentar User=$USER ou User=%u e DynamicUser=true ? Não funciona.)

Existe uma maneira de criar um arquivo de unidade de modelo systemd para vários usuários?

Parece que isso poderia ser feito com os antigos init.d

    
por Kartik 09.03.2018 / 08:27

1 resposta

2

Não é possível passar vários parâmetros para o modelo do systemd (consulte lista de discussão relacionada discussão ). No entanto, como temos apenas dois parâmetros e um é o nome de usuário, faz sentido torná-lo um serviço do usuário em vez de um serviço do sistema.

Os serviços do usuário podem ser executados durante a inicialização se você ativar a demora para esses usuários:

sudo loginctl enable-linger username

Em 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.

Você pode criar um serviço de usuário em /etc/systemd/user , que seria semelhante a (adaptando seu serviço anterior):

[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

Use o especificador %h para o diretório inicial do usuário. Eu omiti o campo User= , o que não faz sentido nas sessões do usuário. Observe também a alteração para WantedBy in [Install] de multi-user.target (que não existe nas sessões do usuário) para default.target .

Os usuários podem controlar esse serviço usando os comandos systemctl --user . (Observe que você pode precisar reiniciar depois de ativar o linger se esse usuário ainda não tiver efetuado login, para que uma sessão do usuário seja iniciada para eles.)

    
por muru 09.03.2018 / 09:39