web-dev-qa-db-ja.com

systemdサービスファイルでのDISPLAYの設定

Xclockをサービスとして開始することで、systemdサービスを学習しようとしています。サービスファイルは以下です

[Unit]
Description=clock

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock

[Install]
WantedBy=graphical.target

ここで何が問題になっていますか? 「ディスプレイに接続できません」というエラーが表示されます。

8
dogs

Xディスプレイでウィンドウを開くには、アプリケーションに2つのものが必要です。 Xディスプレイの場所を知る必要があります。それはDISPLAY環境変数によって伝えられます。また、Xサーバーでの認証も必要です。これはCookieを介して伝達されます。Cookieは、Xサーバーが起動したときに生成され、Xサーバーを起動したユーザーだけがアクセスできるファイルに格納されている秘密の値です。デフォルトのcookieファイルは~/.Xauthority

XサーバーがデフォルトのCookieファイルの場所を使用している場合は、Environment=XAUTHORITY=/home/dogs/.Xauthorityは機能します(/home/dogsは、Xでログインしているユーザーのホームディレクトリです。場所を見つける必要がある場合は、 別のユーザーのデスクトップでrootとしてグラフィカルプログラムを起動できますか? および リモートXディスプレイでウィンドウを開く(なぜ「ディスプレイを開けない」か)を参照してください。 ?

または、Xサーバーを実行しているユーザーとしてプログラムを実行しても、Cookieファイルがデフォルトの場所にある場合は機能します(そうでない場合は、ルートケースのようにCookieファイルを見つける必要があります)。 Userディレクティブを追加します(例:User=dogs)。

もちろん、指定したユーザーが所有するその番号のXディスプレイがない場合、サービスは実行されません。

SystemdからGUIプログラムを開始するのはかなり奇妙です。これのために設計されていません。 GUIプログラムは、ユーザーが開始したXセッションに存在します。 Systemdはシステムプロセス用です。代わりにデーモンを試す必要があります。