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

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

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

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

/usr/bin/touchpad-enable-tap-clique:

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

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

Com base em minha pesquisa, preparei um arquivo de serviço simples no formato /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

do que executar o seguinte 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'.

diário -xedepois de 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, agradeço.

Responder1

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 GUI. Na verdade, eles são executados antes do início da GUI. Para executar xinput, você precisa ter uma GUI, que é fornecida por umServidor X.

As aplicações sabem qual é o contexto da GUI (ou seja, com qual servidor X se comunicar) através da DISPLAYvariável de ambiente. Esta é uma forma de verificar se uma GUI está disponível: se essa variável não estiver definida, você está fora do contexto da GUI. (Definir a variável não criará um contexto de GUI. Poderia permitir que você se conectasse a um contexto de GUI existente de fora, mas isso não é relevante aqui.)

Se o seu prompt de login estiver no modo gráfico, você está usando umgerenciador de exibição. Você pode configurar o gerenciador de exibição para ser executado xinpute 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; verComo posso executar um script que inicia antes da minha tela de login?para mais detalhes.

Não importa como você faz login, você pode aplicar as configurações como parte de seus scripts de login. Se você estiver usando .xinitrcou .xsessionpara 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 xinputcomando ou um script que o execute 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, você pode executar um comando no momento do login da GUI, colocando umexeccomandona tua ~/.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. No entanto, pode fornecer uma maneira de executar um comando quando você faz login; Veja oArco Wikipor exemplo.

Responder2

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

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

A primeira coisa a tentar é apenas adicionar esse execcomando (sem o desnecessário) ao seu ~/.profile(ou, se você usar bashe existir, ao seu ~/.bash_profile):

xinput set-prop 11 290 1

Observe, entretanto, que isso fará com que ele reclame se você estiver fazendo login de forma não gráfica. Se isso não funcionar (vejaaquipara obter detalhes), encontre uma maneira de adicioná-lo aos programas de inicialização do seu ambiente de desktop. DEs mais populares como Gnome, Cinnamon, KDE, Unity etc., possuem ferramentas GUI que permitem carregar programas no login. Veraquipara saber como fazer isso no openbox eaquipara LXDE. Alternativamente, vejaaquipara uma solução mais global usando ~/config/autostart.

informação relacionada