X에 의존하는 응용 프로그램을 시스템 서비스로 실행할 수 없습니다

X에 의존하는 응용 프로그램을 시스템 서비스로 실행할 수 없습니다

i3wm과 함께 Manjaro 17을 사용하고 있습니다(관련성이 있는 경우).

터치패드 탭 클릭 설정을 수정하기 위해 시작 시 단일 명령을 실행하고 싶습니다. 옵션을 활성화 /usr/bin/하고 해당 모드를 실행 가능으로 변경하는 스크립트를 작성했습니다.

/usr/bin/터치패드-활성화-탭-클릭:

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

스크립트는 아무런 문제 없이 터미널에서 원활하게 실행될 수 있습니다.

제가 조사한 내용을 바탕으로 /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

재부팅하기 전에 다음 명령을 실행하는 것보다:

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

나는 또한 전체 경로를 시도했습니다.

다음과 같은 결과로 서비스가 작동하지 않습니다.

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

저널 -xe서비스 재시작을 시도한 후:

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

당신이 나를 도울 수 있기를 바랍니다. 감사합니다.

답변1

GUI는 운영 체제의 고유한 부분이며 시스템은 여러 GUI 환경을 가질 수 있습니다. 서비스가 GUI 컨텍스트 외부에서 실행되기 때문에 systemd를 사용한 시도가 작동하지 않습니다. 실제로 GUI가 시작되기 전에 실행됩니다. 을(를 ) 실행하려면 xinput다음에서 제공하는 GUI가 필요합니다.X 서버.

응용 프로그램은 환경 변수를 통해 GUI 컨텍스트(즉, 통신할 X 서버)가 무엇인지 알고 있습니다 DISPLAY. 이는 GUI를 사용할 수 있는지 확인하는 방법입니다. 해당 변수가 설정되지 않은 경우 GUI 컨텍스트 외부에 있는 것입니다. (변수를 설정해도 GUI 컨텍스트가 생성되지 않습니다. 외부에서 기존 GUI 컨텍스트에 연결할 수 있지만 여기서는 관련이 없습니다.)

로그인 프롬프트가 그래픽 모드인 경우디스플레이 관리자. 를 실행하도록 디스플레이 관리자를 구성하면 xinput로그인 프롬프트가 표시되는 즉시 설정이 적용됩니다. 이를 수행하는 방법은 사용 중인 디스플레이 관리자에 따라 다릅니다. 보다로그인 화면 전에 시작되는 스크립트를 어떻게 실행할 수 있나요?상세 사항은.

로그인 방법에 관계없이 로그인 스크립트의 일부로 설정을 적용할 수 있습니다. GUI 세션을 사용하거나 .xinitrc시작 하려면 거기에 명령을 추가하세요. .xsession시작 응용 프로그램 개념이 있는 데스크톱 환경을 사용하는 경우 명령 xinput이나 이를 실행하는 스크립트를 시작 응용 프로그램에 추가하세요. 창 관리자를 직접 사용하는 경우 시작 시 명령을 실행하는 방법에 대한 설명서를 확인하세요(거의 모든 창 관리자가 이 작업을 수행할 수 있음).

i3을 사용하고 있으므로 GUI 로그인 시 다음을 입력하여 명령을 실행할 수 있습니다.exec명령당신의 ~/.i3/config:

exec xinput set-prop 11 290 1

systemd는 디스플레이 관리자를 서비스로 시작하지만 결과 GUI 컨텍스트에서 명령을 실행하는 방법을 제공하지 않는다고 생각합니다. 그러나 로그인할 때 명령을 실행하는 방법을 제공할 수도 있습니다. 참조아치 위키예를 들어.

답변2

이는 X가 로드되기 전에 X 시스템(GUI)의 동작을 수정하는 명령을 실행하려고 하기 때문에 발생합니다. 그래서 당연히 X 서버에 연결할 수 없다고 불평합니다. 힌트는 실행 중인 명령의 이름입니다.엑스입력 .

이제 systemd가 아직 시작되지 않은 서버와 상호 작용하는 기능을 가까운 장래에 개발하지 않을 것이라고 보장할 수는 없지만 당분간 이것은 작업에 적합한 도구가 아닙니다.

가장 먼저 시도해야 할 것은 해당 명령을 (불필요한 없이 exec) ​​귀하의 ~/.profile(또는 사용하고 bash있는 경우 ~/.bash_profile)에 추가하는 것입니다.

xinput set-prop 11 290 1

그러나 그래픽이 아닌 방식으로 로그인하는 경우 불만이 발생할 수 있습니다. 그래도 작동하지 않으면(참조여기자세한 내용은) 데스크탑 환경의 시작 프로그램에 추가하는 방법을 찾으십시오. Gnome, Cinnamon, KDE, Unity 등과 같은 가장 인기 있는 DE에는 로그인 시 프로그램을 로드할 수 있는 GUI 도구가 있습니다. 보다여기openbox에서 수행하는 방법과여기LXDE의 경우. 또는 다음을 참조하세요.여기.~/config/autostart

관련 정보