Como definir uma unidade do systemd para iniciar depois de carregar a área de trabalho?

2

Eu criei a unidade systemd para x0vncserver assim

[Unit]
Description=Remote desktop service (VNC)
After=graphical.target


[Service]
Type=forking
User=user
ExecStart=/usr/bin/sh -c '/usr/bin/x0vncserver -display :0 -rfbport 5900 -passwordfile /home/user/.vnc/passwd &'

[Install]
WantedBy=multi-user.target

e permitiu que ele fosse executado, mas falha. Então percebi que estou tentando carregar a área de trabalho original usando x0vncserver, só posso fazer isso depois de carregar o desktop completamente. Então eu tenho que definir a unidade do sistema para ser executado após o carregamento da área de trabalho, mas como? Ou qualquer maneira de configurá-lo? Embora seja possível usar ferramentas de sessão de desktop, mas qualquer solução de maneira sistêmica?

e meu default.target é

# systemctl get-default       
graphical.target
    
por Pavel Sayekat 13.10.2017 / 05:18

3 respostas

3

A primeira sugestão não funcionou para mim. Então eu tentei uma solução alternativa em vez disso. Eu configurei minha unidade systemd x0vncserver da seguinte forma

[Unit]
Description=Remote desktop service (VNC)
After=multi-user.target

[Service]
Type=forking
User=user
ExecStart=/bin/sh -c '/usr/bin/x0vncserver -display :0 -rfbport 5900 -passwordfile /home/user/.vnc/passwd &'

[Install]
WantedBy=default.target

E como o serviço acima falha porque tenta carregar antes da área de trabalho: 0 carrega, eu configurei uma unidade de timer do systemd como x0vncserver.timer para executar a x0vncserver.service unidade após um tempo definido considerando o tempo de carregamento da área de trabalho máquina (com baixa configuração antiga) como abaixo

[Unit]
Description=x0vncserver timer

[Timer]
# Time to wait after booting before it run for first time
OnBootSec=2m
Unit=x0vncserver.service

[Install]
WantedBy=default.target

Em seguida, ativei a unidade do timer em systemctl enable x0vncserver.timer e reiniciei. Desta vez funcionou como meu objetivo era iniciar o servidor sem a minha intervenção manual:).

    
por 16.10.2017 / 15:18
2

Depois de olhar para a falta de respostas que não incluem algum tipo de solução adicional, eu mesmo criei essa solução. A solução estava no arquivo unitário, afinal, eu verifiquei o systemd .unit arquivo man em "After=", que requer que um determinado alvo / serviço esteja em execução antes de iniciar a unidade atual, o "Requires=" sozinho iniciará o serviço juntamente com sua dependência simultaneamente. Aqui está uma citação desse manual:

If a unit foo.service requires a unit bar.service as configured with Requires= and no ordering is configured with After= or Before=, then both units will be started simultaneously and without any delay between them if foo.service is activated.

Portanto, se o servidor xeo x0vncserver forem inicializados ao mesmo tempo, o servidor x0vncserver falhará por não conseguir conectar-se a um servidor x inicializado. Eu precisava adicionar meu DM especificamente ao "Requires=" e "After=" para que isso funcionasse. Agora que isso é feito, funciona todas as vezes sem qualquer mágica adicional. Você precisará substituir as entradas "nodm.service" pelo gerenciador de exibição específico que estiver usando. As linhas "Restart" estão lá apenas no caso de eu decidir reiniciar a minha sessão fazendo logout, o que irá terminar o servidor X e reiniciá-lo imediatamente (desde que eu esteja usando o nodm). Não sei ao certo, mas acho que isso também se aplica ao usar um DM padrão, já que o servidor x estaria sendo executado para login e, em seguida, ser finalizado com a nova sessão de usuário x substituindo-a após o login bem-sucedido. Os únicos efeitos colaterais disso são a sessão VNC sendo desconectada e precisando ser reiniciada, mas não acho que exista uma solução para esse problema específico sem mais mágica.

Aqui está o meu arquivo x0vncserver @ .unit:

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target multi-user.target nodm.service
Requires=nodm.service

[Service]
Type=simple
ExecStart=/usr/bin/x0vncserver -display %i -rfbport 5900 -securitytypes none
Restart=always
RestartSec=3


[Install]
WantedBy=multi-user.target

Como nota adicional, sugiro modificar a diretiva "-securitytypes" para algo mais seguro, pois estou usando isso apenas em uma rede local na qual sou o único usuário e não estou preocupado com problemas de segurança.

    
por 03.01.2018 / 16:08
1

Isso já foi respondido em Definindo o DISPLAY no arquivo de serviço systemd .

Se isso não funcionar, recomendo usar o recurso "autostart" oferecido pela maioria dos desktops. No entanto, usar systemd seria preferível, pois systemd reiniciaria seu aplicativo se ele falhasse e o recurso autostart não.

    
por 13.10.2017 / 13:24