~/.config/systemd/user
いくつかのX機能を必要とするユーザーサービスがあります(いくつかの絵画と画像処理機能が必要です)。単位ファイルは次のとおりです。
[Unit]
Description=A Sample Service
After=network.target display-manager.service
[Service]
Type=simple
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/afshar/.Xauthority"
ExecStart=/home/afshar/myService.AppImage
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
以下で正常に有効になりました。
systemctl --user daemon-reload
systemctl --user enable --now MyService
また、ユーザーがログインするまで、ユーザーのログアウトとシステムの起動時にサービスが実行され続けるようにユーザー遅延機能を有効にしました。
loginctl enable-linger
Xに依存しない場合、すべてが期待どおりに機能します。ただし、Xが必要な機能がサービスに追加されると、ユーザーがログインする前にサービスが開始されず、ユーザーがログアウトすると終了します。ユーザーセッションがないため(または他の問題がある可能性があるため)、遅いユーザーはXにアクセスできないようです。ログインする前にXを起動する必要があるユーザーサービスを取得するにはどうすればよいですか?
答え1
Xディスプレイの有効なXセッションCookieは、ユーザーがafshar
ログインするまで/home/afshar/.Xauthority
含まれません。古いログインの古いCookieを含めることができますが、Xサーバーがログアウトするとリセットされ、新しいセッションCookieが作成されると、このCookieは無効になります。
root 以外のユーザーに可能なアクセス権を付与します。
つまり、何らかの方法でログイン画面に影響を与える可能性のあるコンポーネントはセキュリティに敏感なコンポーネントになり、ログイン画面にシステム管理者レベルの設定が必要です。一般ユーザー権限だけではこれを行うことはできません。そうでなければ、大きなセキュリティホールがあります。つまり、ログインダイアログボックスの整合性が疑問視され、システムがユーザーを互いから完全に保護できなくなります。
同様に、ユーザーがGUIにログインしたときにユーザープロセスが新しいXセッションCookieのコピーを取得するように自動的に許可するのは、afshar
そのユーザーのセキュリティに違反することです。not_afshar
サービスの主要部分と通信するために、D-Busまたは他のメカニズムを使用する別のコンポーネントとして、X機能が必要な部分を実装する必要があるかもしれません。その後、ログインXサーバーの初期化スクリプトの前に、そのコンポーネントのインスタンスを起動してログイン画面でそのタスクを実行できます(rootまたは一部の専用アプリケーションユーザーとして実行)。その後、ユーザーがログインすると、そのコンポーネントが消えて消えることがあります。ユーザーセッションがコンポーネントの他のインスタンスを起動できるようにします(ログインしたユーザーとして実行)。
これを行うには、必要に応じて接続をリセットできるように、基本サービスがX機能コンポーネントのシャットダウンと再起動を処理できる必要があります。