Eu estive pesquisando isso e a resposta do grawity parece desatualizada. Agora você pode configurar os serviços do usuário com systemd que são executados como parte da sessão do usuário. Eles podem ter DISPLAY e XAUTHORITY definidos (atualmente no Arch e Debian Stretch).
Isso faz sentido em relação às recomendações anteriores do uso de arquivos de inicialização automática da área de trabalho, à medida que você obtém o gerenciamento de processos como faria com um aplicativo no nível do sistema (reinicialização, etc.).
Os melhores documentos agora são o wiki do Arch; Systemd / Usuário
Versão TLDR;
- Crie o arquivo * .service desejado em
~/.config/systemd/user/
- Executar
systemctl --user enable [service]
(excluir sufixo .service)
- Opcionalmente, execute
systemctl --user start [service]
para começar agora
- Use
systemctl --user status [service]
para verificar como está indo
Alguns outros comandos úteis.
systemctl --user list-unit-files
- visualizar todas as unidades de usuário
- s
ystemctl --user daemon-reload
- se você editar um arquivo .service
-- Mais tarde...
Atualizei e converti a maioria dos meus daemons de sessão em arquivos systemd .service. Para adicionar algumas notas adicionais.
Não havia gancho padrão para executar os serviços no logon, portanto, você deve acioná-lo. Eu faço isso no meu arquivo ~ / .xsession.
systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target
A primeira linha importa algumas variáveis de ambiente para a sessão do usuário systemd e a segunda inicia o destino. Meu arquivo xsession.target;
[Unit]
Description=Xsession running
BindsTo=graphical-session.target
Meu xbindkeys.service como um exemplo.
[Unit]
Description=xbindkeys
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always
[Install]
WantedBy=xsession.target
A dica usual é "não".
redshift
não é um serviço de todo o sistema - ele teria uma instância separada para cada sessão e precisa saber como se conectar ao Xorg dessa sessão específica.(O Xorg também não é um serviço do sistema - apenas o gerenciador de exibição é, e também lança um Xorg separado para cada sessão. //
graphical.target
informa quando o gerenciador de exibição está pronto, mas não diz nada sobre quando o DM realmente inicia o primeiro - ou todos -.)Apenas iniciá-lo na inicialização
DISPLAY=:0
não é suficiente, pois não há garantia de que exista exatamente uma tela a qualquer momento, nem que seja sempre:0
(por exemplo, se o Xorg travar deixando um arquivo de bloqueio obsoleto, o próximo será executado:1
como pensaria que:0
ainda está ocupado); você também precisa definir o caminho para o seuXAUTHORITY
arquivo, pois o X11 exige autenticação; e verifique seredshift
é reiniciado se você sair e efetuar login novamente.Então, como começar? Quase sempre, o ambiente da área de trabalho possui vários métodos para iniciar seus próprios serviços de sessão . Veja uma postagem antiga que já descreve as duas usuais; o
~/.xprofile
script e a~/.config/autostart/*.desktop
localização.Se você usa o startx , pode usar
~/.xinitrc
para iniciar essas coisas. Os gerenciadores de janelas independentes geralmente têm seus próprios scripts de inicialização / inicialização; por exemplo,~/.config/openbox/autostart
para o Openbox.O comum de todos esses métodos é que o programa seja iniciado dentro da sessão, evitando todos os problemas listados acima.
fonte
Aqui está o que eu criei como solução alternativa para o ainda não disponível
graphical-session.target
(no meu sistema Kubuntu 16.04):Crie
~/.config/systemd/user/xsession.target
com o seguinte conteúdo:Informe o systemd sobre esta nova unidade:
xsession.target
mecânica atualmente disponível na área de trabalho Ubuntu 16.04.Crie
~/.config/autostart-scripts/xsession.target-login.sh
com o seguinte conteúdo:Crie
~/.config/plasma-workspace/shutdown/xsession.target-logout.sh
com o seguinte conteúdo:Torne os scripts executáveis:
Nota: esses dois arquivos são colocados onde o KDE os buscará para inicialização automática e desligamento. Os arquivos podem ser colocados em outro lugar para outros ambientes de desktop (por exemplo, Gnome) - mas eu não conheço esses ambientes.
Nota: Esta solução alternativa não oferece suporte a sessões com várias áreas de trabalho. Ele lida apenas com o
graphical-session.target
correto, desde que apenas uma sessão X11 ativa seja executada em uma máquina (mas esse é o caso da maioria de nós, usuários do Linux).graphical-session.target
e que sejam executadas de maneira limpa enquanto estão logadas na área de trabalho.Como exemplo, a unidade do @ mkaito deve ficar assim:
(Não esqueça de fazer
daemon-reload
depois de editar suas unidades!)Em algum dia futuro (será o Ubuntu 17.04?), Minha solução alternativa se tornará obsoleta, pois o sistema manipulará o processo
graphical-session.target
corretamente. Nesse dia, remova o script de inicialização automática e desligamento e também asxsession.target
suas unidades de usuário personalizadas podem permanecer intocadas e funcionar.fonte
Esta solução faz exatamente o que o autor da pergunta pede:
Embora possa haver melhores maneiras de fazer isso, como já foi respondido por outros usuários, essa é outra abordagem para esse problema.
É semelhante ao systemd -networkd-wait-online.service do systemd, que bloqueia até que certos critérios sejam atendidos. Outros serviços que dependem dele serão lançados assim que o serviço for iniciado com sucesso ou atingir o tempo limite.
De acordo com o manual (seção "Arquivos"), o servidor X criará um soquete UNIX
/tmp/.X11-unix/Xn
(onden
é um número de exibição).Ao monitorar a presença desse soquete, podemos determinar que o servidor para uma exibição específica foi iniciada.
confirm_x_started.sh
:x_server_started.service
:Agora, habilite
x_server_started.service
para iniciar ao mesmo tempo com o servidor X.Faça com que outros serviços (que precisam do servidor X sejam iniciados) dependam
x_server_started.service
unidade dependente:
Se o servidor X for iniciado sem problemas, o sistema
x_server_started.service
iniciará quase imediatamente e o systemd continuará a iniciar todas as unidades que dependemx_server_started.service
.fonte