システムユーザーサービスを有効にするDEB postinstスクリプトを作成するには?

システムユーザーサービスを有効にするDEB postinstスクリプトを作成するには?

systemdユーザーサービスをインストールするためにDEBファイルを生成し、インストール後にpostinstスクリプトを使用してサービスを有効にしてみました。これは私のpostinstスクリプトです。

#!/bin/bash

set -e
systemctl --user enable myservice.service

DEB() をインストールすると、dpkg --install mypackage.debpostinst スクリプトが実行され、次のエラーメッセージが返されます。

バスに接続できません。そのファイルやディレクトリはありません。

システムサービスも利用できず、パッケージも公開されないため、どのパッケージング標準も気にしません。これを行うために私ができることはありますか?

これが不可能な場合は、起動するたびにアクティブになるようにinitスクリプトに追加します。しかし、可能であればこれを避けたいと思います。

答え1

あなたがやろうとしていることはうまくいきません。インストールを実行しているユーザーにsystemdサービスをインストールすることはあまり役に立ちません。そのユーザーは常にルートだからです。したがって、サービスをすべてのユーザーのシステム全体のサービスとしてインストールする規則に従う必要があります。これを行う標準的な方法は次のとおりです。


最近、ほとんどのパッケージはdebhelperを使用しています。これはプロセスを大幅に簡素化します。次の手順に従って始めてください。よりDebian Wikiのシステムパッケージングガイドより多くの情報を知りたいです。

dh_systemdを有効にする

debhelper compat レベル 10 (Build-Depends合計部分の確認) を使用すると、dh-systemd が自動的に有効になり、この部分をスキップできます。以前の debhelper 互換性レベルの場合は、次の手順に従って有効にする必要があります。debian/controldebian/compat

  • dh-systemd (>=1.5)に追加してください。Build-Dependsdebian/control
  • --with systemdに追加してください。dh $@debian/rules

dh_systemdの使用

debian/インストールできるように、システムデバイスファイルをここに挿入してください。 Debhelperはパッケージのインストール中に自動的に検出して有効にします。

postinst注:とスクリプトpostrmに何も追加する必要はありません。 debhelperは自動的にこれらのタスクを処理します。また、手動の方法はsystemctl実行可能ファイルに依存しているため、ユーザーがパッケージをインストールするときにsystemdがインストールされているシステムでのみ機能することに注意してください。 debhelper メソッドは、systemd がインストールされていない場合でも systemd サービスを有効にします。ユーザーが後で systemd に切り替えると、サービスはすでに有効になっています。 debhelper アプローチは、パッケージが以前の Sys-V スタイル初期化スクリプトと systemd 単位ファイルで提供されている場合でもうまく機能します。

あらかじめご利用ください

特別な要件がある場合(複数のユニットファイルをインストールしますが、それらの一部のみを有効にするなど)のターゲットをオーバーライドし、追加のパラメータをdh_systemd_enable指定できます。よりdh_systemd_startdebian/rulesdh_systemd_enable のマニュアルページそしてdh_systemd_startもっと学ぶ。

答え2

Martin Conradが言ったように、--userサービスをそのままインストールしてみてください。ユーザーの皆さん、これが望むものではないかもしれません。

私の場合は、この問題がありましたが、オーディオシステムにアクセスする必要があるため、ユーザー用のサービスをインストールする必要があり、システムが特定のエンドユーザーに設定されていて、そのエンドユーザーがログインしている場合にのみ機能しました。 - 私の組み込みシステムの場合です。)

以下は、ユーザー固有のサービスを設定するために使用する数行のコードです。

# Manually enable "service-name" for USER_NAME
USER_NAME=nobody
mkdir -p /home/${USER_NAME}/.config/systemd/user/default.target.wants
chown -R ${USER_NAME}:${USER_NAME} /home/${USER_NAME}/.config/systemd
rm -f /home/${USER_NAME}/.config/systemd/user/default.target.wants/service-name.service
sudo -H -u ${USER_NAME} sh -c "ln -s /usr/lib/systemd/user/service-name.service /home/${USER_NAME}/.config/systemd/user/default.target.wants/service-name.service"

サービスを有効にするユーザーの名前を編集します(USER_NAME=...)。

service-nameユーザーサービスの名前に変更してください。たとえば、サウンドを管理している場合はこれを呼び出すことができますsound-manager


注1:スクリプトは、ユーザーがから作成されたと仮定します/home/<username>。他のユーザーを使用している場合は、状況に合わせて調整する必要があります(たとえば、アカウントが下に表示され、rootDebian /root/ UbuntuのApache2アカウントが下に表示される/var/wwwなど)。

ノート2:これをどうしたの? !実際、私は台本自体を発明しませんでした。としてログインすると、$USER_NAME次のコマンドを使用してサービスを有効にできます。

systemctl enable --user service-name

これにより、上記のディレクトリとリンクが作成されます。状況が変更された場合、または別のディレクトリに保存された場合は、実行された操作を複製systemctlするためにコマンドを調整する必要があります。

ノート3:すべてのユーザーにインストールできます。名前の上にループを追加し、名前ごとに/home/*コマンドを繰り返します。新しいユーザーの作成時に実行されるスクリプトのセットもあります。そのようなサービスが必要ないことを願っています。これらのサービスは、各ユーザーが自分でアクティブにすることをお勧めします。

関連情報