web-dev-qa-db-ja.com

Xに依存するアプリケーションをsystemdサービスとして実行できません

私はi3wmでManjaro 17を使用しています(関連がある場合)。

起動時に単一のコマンドを実行して、タッチパッドのタップクリック設定を修正したい。 /usr/bin/のオプションを有効にするスクリプトを作成し、そのモードを実行可能に変更しました。

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

#!/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 status

[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サービスの再起動を試みた後:

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

お役に立てれば幸いです。

5
Archaeon

GUIはオペレーティングシステムの一部であり、マシンは複数のGUI環境を持つことができます。サービスはGUIコンテキストの外で実行されるため、systemdを使用した試みは機能しません。実際、GUIが起動する前に実行されます。 xinputを実行するには、 Xサーバー によって提供されるGUIが必要です。

アプリケーションは、DISPLAY環境変数を通じて、GUIコンテキストが何であるか(つまり、どのXサーバーと通信するか)を知っています。これは、GUIが使用可能かどうかを確認する方法です。その変数が設定されていない場合、GUIコンテキストの外にいます。 (変数を設定しても、GUIコンテキストは作成されません。外部から既存のGUIコンテキストに接続できますが、ここでは関係ありません。)

ログインプロンプトがグラフィカルモードの場合、 ディスプレイマネージャー を使用しています。 xinputを実行するようにディスプレイマネージャーを構成すると、ログインプロンプトが表示されるとすぐに設定が適用されます。その方法は、使用しているディスプレイマネージャーによって異なります。詳細については、 ログイン画面の前に起動するスクリプトを実行するにはどうすればよいですか? を参照してください。

どのようにログインしても、ログインスクリプトの一部として設定を適用できます。 .xinitrcまたは.xsessionを使用してGUIセッションを開始している場合は、そこにコマンドを追加します。スタートアップアプリケーションの概念を持つデスクトップ環境を使用している場合は、xinputコマンドまたはそれを実行するスクリプトをスタートアップアプリケーションに追加します。ウィンドウマネージャーを直接使用している場合は、起動時にコマンドを実行する方法をドキュメントで確認してください(ほとんどすべてのウィンドウマネージャーで実行できます)。

I3を使用しているため、~/.i3/configexec command を挿入することにより、GUIログイン時にコマンドを実行できます。

exec xinput set-prop 11 290 1

Systemdはサービスとしてディスプレイマネージャーを起動しますが、結果のGUIコンテキストでコマンドを実行する方法を提供するとは思いません。ただし、ログイン時にコマンドを実行する方法が提供される場合があります。例は Arch Wiki を参照してください。

これは、Xがロードされる前にXシステム(GUI)の動作を変更するコマンドを実行しようとしているために発生します。したがって、当然のことながら、Xサーバーに接続できないというメッセージが表示されます。ヒントは、実行しているコマンドの名前です:xinput。

さて、systemdが近いうちにまだ起動していないサーバーと対話する機能を開発しないことを保証することはできませんが、当分の間、これは仕事に適したツールではありません。

最初に試すことは、それを(不要なexecなしで)~/.profile(またはbashを使用していて、存在する場合は~/.bash_profile)に追加することです。

xinput set-prop 11 290 1

ただし、非グラフィックでログインしている場合は、これにより問題が発生することに注意してください。それが機能しない場合(詳細は こちら を参照)、デスクトップ環境のスタートアッププログラムに追加する方法を見つけます。 Gnome、Cinnamon、KDE、Unityなどの最も人気のあるDEには、ログイン時にプログラムをロードできるGUIツールがあります。 openboxでの実行方法については here を、LXDEについては here を参照してください。または、~/config/autostartを使用したよりグローバルなソリューションについては here を参照してください。

3
terdon