Xclockをサービスとして開始することで、systemdサービスを学習しようとしています。サービスファイルは以下です
[Unit]
Description=clock
[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock
[Install]
WantedBy=graphical.target
ここで何が問題になっていますか? 「ディスプレイに接続できません」というエラーが表示されます。
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はシステムプロセス用です。代わりにデーモンを試す必要があります。