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


9

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

[Unit]
Description=clock

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

[Install]
WantedBy=graphical.target

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

回答:


18

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

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

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

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

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


1
を使用しても問題ありませんsystemctl --user。また、DISPLAY変数は問題ではありません。見ていこちらを
スウェギ

-2

追加できます.xinitrc

xhost si:localuser:$USER

わたしにはできる!


1
これは.xinitrcではなくsystemdサービスファイル用です
slang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.