ユーザーサービスを起動し、ユーザーがログインしたときにのみ起動するようにUbuntuパッケージを設定するにはどうすればよいですか?

ユーザーサービスを起動し、ユーザーがログインしたときにのみ起動するようにUbuntuパッケージを設定するにはどうすればよいですか?

X-WindowsとDBusへのアクセスを必要とするサービスを設定しようとしています。最初はバックグラウンドアプリで作ってみましたが、うまくいきませんでした。 「自動ログインユーザー」機能を使用します。それでは、自動ログインユーザー(例alexis:)でサービスを実行する必要があると思います。私の問題は、そのユーザーとして実行されるサービス(設定やUser=alexis変数Group=alexisなど)を簡単に作成できることです。環境変数(DISPLAY=:0)も追加する必要がありました。ただし、サービスはまだシステムサービスとして開始されます。

私のアイデアは、ユーザーがログインしたときに開始される方法でサービスを作成することです。実行すると、多くのsystemdエントリが表示されます。

systemctl --user list-units

しかし、これらのサービスファイルを生成し、OS全体ではなくユーザーのためのサービスを生成するためにUbuntuパッケージ生成ツールチェーンを取得する方法はわかりません。

プロジェクトフォルダmy-daemon.serviceに残っている現在のファイルは次のとおりです。debian

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html

[Unit]
Description=Daemon

[Service]
Type=simple
WorkingDirectory=~
ProtectHome=false
NoNewPrivileges=true
ExecStart=/usr/sbin/my-daemon
ExecStop=kill "$MAINPID"
Restart=on-failure
RestartSec=1min
User=alexis
Group=alexis
LimitNPROC=1000

[Install]
WantedBy=xsession.target

だから私は以下にサービスファイルをインストールしますが、/lib/systemd/system私の場合は間違っているようです。それ以外の場合は、期待どおりに動作しているように見えますが、ユーザーごとのユニットが正しく設定されていることを実際に100%確信できません。周りを見回したが、ユーザー単位に関する多くの情報が見つかりません。一流の秘密のようなものです...

答え1

@ajgringo619と@meuhのコメントに基づいて、次のソリューションを使用しました。

  1. my-daemon.service ファイルを手動でインストール

    my-daemon.serviceプロジェクトdebianディレクトリから別のディレクトリ(私が使用しているディレクトリ)に移動しましたconf

  2. .installサービスをユーザーサービスとしてインストールするために、私のプロジェクトファイルに行を追加しました。

     conf/my-daemon.service      /usr/lib/systemd/user/.
    

    これも見てくださいアーチLinuxページ(リンク提供:@meuh)

  3. サービスの有効化

    インストールを実行すると、そのユーザーに対してdbusが実行されないため、これを行うことはできませんsystemctl(つまり、自分のアカウントからインストールし、インストールパッケージは存在しますが非アクティブな「newuser」を作成します)。だからサービスを有効にするには手動ソフトリンクを作成します。

    これには少し作業が必要です。まずフォルダがあることを確認し、ソフトリンクを作成してから、ユーザーの所有権を変更してください。

     mkdir -p /home/newuser/.config/systemd/user/default.target.wants
     ln -s /usr/lib/systemd/user/my-daemon.service /home/newuser/.config/systemd/user/default.target.wants/.
     chown -R newuser:newuser /home/newuser/.config/systemd
    
  4. 掃除する

    (3)と反対の方法が必要な場合は、ソフトリンクを削除し、そのフォルダを削除する必要があります。-fこのオプションが削除された場合は、そのオプションを使用してrmdirから使用してください--ignore-fail-on-non-empty。の場合、rmdir最も深いものから一つずつ削除しなければインストール前と同様の状態になります。

  5. 自動的に起動しますか?

    (3)で作成されたリンクが自動的に起動(アクティブ化)され、コンピュータを再起動またはログアウトしてから再度ログインすると、新しいユーザーとデバイスが自動的に起動します。もちろん、これはサービスが正常に機能しているという前提で行われます。あなたの〜したい正しく定義されました。

     [Install]
     WantedBy=default.target
    

    ユーザーサービスでは機能しない他のオプションがあります。たとえば、User=...またはオプションを指定することはできませんGroup=...。これらのエラーはそのジャーナルに表示されます

     journalctl --user -u my-daemon
    

    重要:これは--user非常に重要です。以前にサービスをシステムサービスとして実行した場合、--userシステムサービスのログは表示されますが、ユーザーログの内容は表示されません。

もう1つの詳細は、ウィンドウを開く必要があり、ウィンドウが機能するために環境変数を追加する必要があることです。

Environment="DISPLAY=:0"

デバイスログに表示されるエラーに基づいてこれらの調整を行う必要があります。

関連情報