目的:すべてのユーザーが起動できるシステムサービスをインストールします。問題は、ユーザーサービスを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ユーザーサービスをインストールするには、以下にリストされているフォルダーの.service
1つにユニットファイルを配置するだけです。ユーザー単位の検索パス存在するman systemd.unit(5)
。重要なことは:
/etc/systemd/user/*
(通常はシステム管理者が使用するように設計されています)/usr/lib/systemd/user/*
(通常インストールされているパッケージで使用されることが予想されます)
sudo
これらのサービスファイルをこれらのフォルダにインストールするには、通常/ root権限が必要です。
すべてのユーザーに対してシステムユーザーサービスを有効にする
すべてのユーザーに対してサービスを有効にするには、/root権限を必要とする--global
withなどのsystemctlフラグを使用できます。systemctl --global enable
sudo
--global
有効化と無効化とともに使用すると、グローバルユーザー設定ディレクトリで機能し、すべてのユーザーの将来のすべてのログインに対してグローバルにデバイスファイルを有効または無効にします。
からインポート
man systemctl(1)
systemctl preset
代わりに使用systemctl enable
使用を検討することもできます。systemctl preset
変えるsystemctl enable
。systemctl enable
ない限りと同じように機能します。システム基本ファイルdisable my-service.service
この場合、交換されますという行がありますsystemctl disable
。
これにより、ユーザー/管理者はサービスを自動的に有効にするかどうかを決定できます。たとえば、Fedoraにはdisable *
デフォルト値があるため、Fedoraのすべてのシステムサービスはいいえインストール中はデフォルトで有効になります。
しかし、通常、systemdサービスはプロジェクトのMakefileではなく、パッケージマネージャによってインストール/アクティブ化されます。
たとえば、.deb
Debian / 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。