Não é possível executar o aplicativo que depende do X como um serviço systemd

5

Estou usando o Manjaro 17 com i3wm (se houver alguma relevância).

Eu quero executar um único comando na inicialização para corrigir a configuração do clique do meu touchpad. Eu escrevi o script que ativa a opção em /usr/bin/ e mudo seu modo como executável.

/ usr / bin / touchpad-ativar-tocar-clicar:

#!/bin/bash
exec xinput set-prop 11 290 1

O script pode ser executado corretamente no terminal sem causar nenhum problema.

Com base em minha pesquisa, preparei um arquivo de serviço simples em /etc/systemd/system/ .

/etc/systemd/system/touchpad-enable-tap-click.service:

[Unit]
Description=Allow touchpad tap click

[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-enable-tap-click

[Install]
WantedBy=multi-user.target

que executado seguindo o comando antes da reinicialização:

[sercan@compaq ~]$ sudo systemctl enable touchpad-enable-tap-click.service
Created symlink /etc/systemd/system/multi-user.target.wants/touchpad-enable-tap-click.service → /etc/systemd/system/touchpad-enable-tap-click.service.

Eu também tentei o caminho completo.

O serviço não está funcionando, como resultado:

status do systemctl

[sercan@compaq ~]$ systemctl status touchpad-enable-tap-click.service
● touchpad-enable-tap-click.service - Allow touchpad tap click
   Loaded: loaded (/etc/systemd/system/touchpad-enable-tap-click.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sat 2017-04-22 01:51:17 +03; 14min ago
 Main PID: 32429 (code=exited, status=1/FAILURE)

Nis 22 01:51:17 compaq systemd[1]: Starting Allow touchpad tap click...
Nis 22 01:51:17 compaq bash[32429]: Unable to connect to X server
Nis 22 01:51:17 compaq systemd[1]: touchpad-enable-tap-click.service: Main process exited, code=exited, status=1/FAILURE
Nis 22 01:51:17 compaq systemd[1]: Failed to start Allow touchpad tap click.
Nis 22 01:51:17 compaq systemd[1]: touchpad-enable-tap-click.service: Unit entered failed state.
Nis 22 01:51:17 compaq systemd[1]: touchpad-enable-tap-click.service: Failed with result 'exit-code'.

journal -xe após tentar reiniciar o serviço:

Nis 22 02:09:52 compaq sudo[21550]:   sercan : TTY=pts/0 ; PWD=/home/sercan ; USER=root ; COMMAND=/usr/bin/systemctl restart touchpad-enable-tap-click.service
Nis 22 02:09:52 compaq sudo[21550]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nis 22 02:09:52 compaq systemd[1]: Starting Allow touchpad tap click...
-- Subject: Unit touchpad-enable-tap-click.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit touchpad-enable-tap-click.service has begun starting up.
Nis 22 02:09:52 compaq bash[21553]: Unable to connect to X server
Nis 22 02:09:52 compaq systemd[1]: touchpad-enable-tap-click.service: Main process exited, code=exited, status=1/FAILURE
Nis 22 02:09:52 compaq systemd[1]: Failed to start Allow touchpad tap click.
-- Subject: Unit touchpad-enable-tap-click.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit touchpad-enable-tap-click.service has failed.
-- 
-- The result is failed.
Nis 22 02:09:52 compaq systemd[1]: touchpad-enable-tap-click.service: Unit entered failed state.
Nis 22 02:09:52 compaq systemd[1]: touchpad-enable-tap-click.service: Failed with result 'exit-code'.
Nis 22 02:09:52 compaq sudo[21550]: pam_unix(sudo:session): session closed for user root

Espero que você possa me ajudar, eu agradeço.

    
por Archaeon 22.04.2017 / 01:39

2 respostas

3

A GUI é uma parte distinta do sistema operacional e uma máquina pode ter vários ambientes de GUI. Suas tentativas com o systemd não estão funcionando porque os serviços são executados fora de um contexto da GUI. Na verdade, eles são executados antes do início da GUI. Para executar xinput , você precisa ter uma GUI, que é fornecida por um servidor X .

Os aplicativos sabem qual é o contexto da GUI (ou seja, com qual servidor X se comunica) por meio da variável de ambiente DISPLAY . Esta é uma maneira de verificar se uma GUI está disponível: se essa variável não estiver definida, você estará fora de um contexto da GUI. (Definir a variável não criará um contexto da GUI. Ela pode permitir que você se conecte a um contexto da GUI existente de fora, mas isso não é relevante aqui.)

Se o seu login estiver no modo gráfico, então você está usando um gerenciador de exibição . Você pode configurar o gerenciador de exibição para executar xinput e, em seguida, as configurações serão aplicadas assim que o prompt de login for exibido. Como fazer isso depende de qual gerenciador de exibição você está usando; consulte Como posso executar um script que inicia antes da minha tela de login? para obter mais detalhes.

Não importa o seu login, você pode aplicar as configurações como parte dos seus scripts de login. Se você estiver usando .xinitrc ou .xsession para iniciar sua sessão GUI, adicione o comando lá. Se você estiver usando um ambiente de área de trabalho que tenha um conceito de aplicativos de inicialização, adicione o comando xinput , ou um script que o executa, aos seus aplicativos de inicialização. Se você estiver usando um gerenciador de janelas diretamente, verifique sua documentação para saber como executar um comando na inicialização (quase qualquer gerenciador de janelas pode fazer isso).

Como você está usando o i3, é possível executar um comando no tempo de login da GUI, colocando um exec command no seu ~/.i3/config :

exec xinput set-prop 11 290 1

Embora o systemd inicie o gerenciador de exibição como um serviço, não acho que ele forneça uma maneira de executar um comando no contexto da GUI resultante. Pode fornecer uma maneira de executar um comando quando você efetuar login; veja o Arch Wiki para exemplos.

    
por 22.04.2017 / 23:34
3

Isso está acontecendo porque você está tentando executar um comando que modifica o comportamento do sistema X (a GUI) antes do carregamento do X. Então, compreensivelmente, reclama que não pode se conectar ao servidor X. A dica é o nome do comando que você está executando: x input.

Agora, não posso garantir que o systemd não desenvolverá no futuro próximo a capacidade de interagir com um servidor que ainda não foi iniciado, mas, por enquanto, essa não é a ferramenta certa para o trabalho .

A primeira coisa a tentar é simplesmente adicionar esse comando (sem o desnecessário exec ) ao seu ~/.profile (ou, se você usar bash e ele existir, para o seu ~/.bash_profile ):

xinput set-prop 11 290 1

Observe, no entanto, que isso fará com que ela se queixe se você estiver efetuando login não graficamente. Se isso não funcionar (consulte aqui para obter detalhes), encontre uma maneira de adicioná-lo à inicialização do seu ambiente de trabalho programas. Os DEs mais populares, como Gnome, Cinnamon, KDE, Unity, etc, possuem ferramentas GUI que permitem carregar programas no login. Veja aqui sobre como fazer isso em openbox e aqui para o LXDE. Como alternativa, consulte aqui para obter uma solução mais global usando ~/config/autostart .

    
por 22.04.2017 / 01:55