すべてのユーザーに対してsystemdユーザーサービスをインストールして有効にします。

すべてのユーザーに対してsystemdユーザーサービスをインストールして有効にします。

目的:すべてのユーザーが起動できるシステムサービスをインストールします。問題は、ユーザーサービスをsudoインストール(使用)する手順で有効にする(いいえ)ことですsudo

にサービスファイルを入れました/etc/systemd/user/。これは必須ですsudo

それではsudo systemctl --user enable my_serviceうまくいきません。スーパーユーザーはユーザーのためにサービスを有効にすることはできず、ユーザーだけがそうすることができます。

sudo make install問題:このサービスを私のプロジェクトの一部としてインストールしたいと思います。sudoサービスファイルをコピーするためにここに必要です/etc/systemd/user/。このインストール段階では、ユーザーサービスも有効にして、ユーザーがアクティブ化せずに起動できるようにしたいと思います。

私が考えることができる解決策は次のとおりです。

  • その後、インストーラは追加のアクティベーションステップを実行する必要があります(Sudoなし)sudo make install
  • インストールステップの一部としてアクティブ化ステップを実行し、sudo -E -u $USER systemctl....requiredを使用して-E到達しますDBUS_SESSION_BUS_ADDRESS(ユーザーのsystemctlに必要です)。問題はインストールコマンドも必要であることですが-E -u $USER、これは異例です。
  • 失敗すると、ユーザーにenableサービスを実行するように求められます。start
  • どういうわけかそのステップに対する権限を放棄しますenable。方法がわからない。

これが一般的なユースケースになるはずです。人々は通常この問題をどのように解決しますか?

答え1

すべてのユーザーのためのsystemdユーザーサービスのインストール

すべてのユーザーにsystemdユーザーサービスをインストールするには、以下にリストされているフォルダーの.service1つにユニットファイルを配置するだけです。ユーザー単位の検索パス存在するman systemd.unit(5)。重要なことは:

  • /etc/systemd/user/*(通常はシステム管理者が使用するように設計されています)
  • /usr/lib/systemd/user/*(通常インストールされているパッケージで使用されることが予想されます)

sudoこれらのサービスファイルをこれらのフォルダにインストールするには、通常/ root権限が必要です。

すべてのユーザーに対してシステムユーザーサービスを有効にする

すべてのユーザーに対してサービスを有効にするには、/root権限を必要とする--globalwithなどのsystemctlフラグを使用できます。systemctl --global enablesudo

--global

有効化と無効化とともに使用すると、グローバルユーザー設定ディレクトリで機能し、すべてのユーザーの将来のすべてのログインに対してグローバルにデバイスファイルを有効または無効にします。

からインポートman systemctl(1)

systemctl preset代わりに使用systemctl enable

使用を検討することもできます。systemctl preset変えるsystemctl enablesystemctl enableない限りと同じように機能します。システム基本ファイルdisable my-service.serviceこの場合、交換されますという行がありますsystemctl disable

これにより、ユーザー/管理者はサービスを自動的に有効にするかどうかを決定できます。たとえば、Fedoraにはdisable *デフォルト値があるため、Fedoraのすべてのシステムサービスはいいえインストール中はデフォルトで有効になります。


しかし、通常、systemdサービスはプロジェクトのMakefileではなく、パッケージマネージャによってインストール/アクティブ化されます。

たとえば、.debDebian / Ubuntu用のサービスファイルをすでに作成している場合、systemdユーザーサービスファイルを追加して有効にすることは、sudo apt install ./my-debパッケージに名前付きファイルを作成するのと同じくらい簡単です。debian/my-package.user.serviceそれからdh_installsystemduserパッケージをインストールすると、自動的にインストールとアクティブ化、およびアンインストール/非アクティブ化も処理されます。

答え2

すべてのユーザーまたは特定のユーザーに対して特定の「sudo-less」コマンドの実行を有効にすると、これを達成できます。問題のコマンドは次のとおりですsystemctl enable <my_service>。指示に従う前にこの記事を読んでください$ man 5 sudoers

これは2つの方法で行うことができます。

  • /etc/sudoers特定のコマンドを使用して編集します$ sudo visudo。注:混乱を招くと、ホスティングが破損したりアクセスできなくなる可能性がありますsudo。編集する内容は以下の通りです。
  • ファイルの作成: $ sudo visudo -f /etc/sudoers.d/my_service内容については後で詳しく説明します。これは上記の直接修正ほど微妙であることに注意してください/etc/sudoers/etc/sudoers.d/ファイルを編集するよりも削除する/etc/sudoersと、sudoシステム更新プロセス全体にわたって永続的なポリシー変更が作成されるという利点があります。sudoers

編集する内容は次のとおりです。

ALL <your_host_name>=NOPASSWD: /usr/bin/systemctl enable <my_service>

この場合(ユーザー)は、を使用せずにALLホストでコマンドを実行(および実行)できます。<your_host_name>sudo

1人のユーザーに対してのみこれを行うには、ALLそのユーザー名を変更します。両方がない場合(つまり、1つALLのユーザー名ではなく複数のユーザー名)、ユーザーエイリアスを作成してsudo-less cmdを実行する権限を持つユーザー名を集計します。この場合、追加した1行は2行になります。

User_Alias <systserv_enable_users> = Kamela, bkd12, Oliver, Gauthier
<systserv_enable_users> <your_host_name>=NOPASSWD: /usr/bin/systemctl enable <my_service>

この行または次の行を直接追加するには、/etc/sudoers次の行の上に追加します。

@includedir /etc/sudoers.d

HTH。

関連情報