xclockをサービスとして起動し、システムサービスを学習しようとしています。サービスファイルは次のとおりです。
[Unit]
Description=clock
[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock
[Install]
WantedBy=graphical.target
ここで何が起こっているのかというアイデアはありますか? 「モニターに接続できません」というエラーメッセージが表示されます。
ベストアンサー1
アプリケーションがXモニターでウィンドウを開くには2つのことが必要です。 Xモニターの位置を知る必要があり、これはDISPLAY
環境変数を介して渡されます。また、X サーバーに対する認証が必要です。これは、Xサーバーの起動時に生成される秘密の値であるCookieを介して渡され、Xサーバーを起動したユーザーのみがアクセスできるファイルに保存されます。デフォルトのCookieファイルは~/.Xauthority
。
XサーバーがデフォルトのCookieファイルの場所を使用している場合(Xでログインしたユーザーのホームディレクトリであると仮定)、追加はEnvironment=XAUTHORITY=/home/dogs/.Xauthority
機能します。/home/dogs
場所を見つけるには、次を参照してください。他のユーザーのデスクトップからrootとしてグラフィカルプログラムを起動できますか?そしてリモートXモニターでウィンドウを開く(「モニターを開けません」理由)?
または、Cookieファイルがデフォルトの場所にある場合は、Xサーバーを実行しているユーザーとしてプログラムを実行すると機能します(そうでない場合は、ルートケースのようにCookieファイルを見つける必要があります)。ディレクティブを追加しますUser
(例User=dogs
:)。
もちろん、指定したユーザーが所有する番号にXが表示されない場合、サービスは実行されません。
SystemdでGUIプログラムを起動するのはかなり奇妙です。このために設計されていません。 GUIプログラムは、ユーザーが開始したXセッション内に存在します。 Systemdはシステムプロセス用です。デーモンを使ってみてください。