systemdユーザーサービスをインストールするためにDEBファイルを生成し、インストール後にpostinstスクリプトを使用してサービスを有効にしてみました。これは私のpostinstスクリプトです。
#!/bin/bash
set -e
systemctl --user enable myservice.service
DEB() をインストールすると、dpkg --install mypackage.deb
postinst スクリプトが実行され、次のエラーメッセージが返されます。
バスに接続できません。そのファイルやディレクトリはありません。
システムサービスも利用できず、パッケージも公開されないため、どのパッケージング標準も気にしません。これを行うために私ができることはありますか?
これが不可能な場合は、起動するたびにアクティブになるようにinitスクリプトに追加します。しかし、可能であればこれを避けたいと思います。
答え1
あなたがやろうとしていることはうまくいきません。インストールを実行しているユーザーにsystemdサービスをインストールすることはあまり役に立ちません。そのユーザーは常にルートだからです。したがって、サービスをすべてのユーザーのシステム全体のサービスとしてインストールする規則に従う必要があります。これを行う標準的な方法は次のとおりです。
最近、ほとんどのパッケージはdebhelperを使用しています。これはプロセスを大幅に簡素化します。次の手順に従って始めてください。よりDebian Wikiのシステムパッケージングガイドより多くの情報を知りたいです。
dh_systemdを有効にする
debhelper compat レベル 10 (Build-Depends
合計部分の確認) を使用すると、dh-systemd が自動的に有効になり、この部分をスキップできます。以前の debhelper 互換性レベルの場合は、次の手順に従って有効にする必要があります。debian/control
debian/compat
dh-systemd (>=1.5)
に追加してください。Build-Depends
debian/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_start
debian/rules
dh_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>
。他のユーザーを使用している場合は、状況に合わせて調整する必要があります(たとえば、アカウントが下に表示され、root
Debian /root
/ UbuntuのApache2アカウントが下に表示される/var/www
など)。
ノート2:これをどうしたの? !実際、私は台本自体を発明しませんでした。としてログインすると、$USER_NAME
次のコマンドを使用してサービスを有効にできます。
systemctl enable --user service-name
これにより、上記のディレクトリとリンクが作成されます。状況が変更された場合、または別のディレクトリに保存された場合は、実行された操作を複製systemctl
するためにコマンドを調整する必要があります。
ノート3:すべてのユーザーにインストールできます。名前の上にループを追加し、名前ごとに/home/*
コマンドを繰り返します。新しいユーザーの作成時に実行されるスクリプトのセットもあります。そのようなサービスが必要ないことを願っています。これらのサービスは、各ユーザーが自分でアクティブにすることをお勧めします。