web-dev-qa-db-ja.com

特定のユーザーを介してsystemdサービスを実行し、起動時に開始するにはどうすればよいですか?

Ubuntuサーバー14からバージョン15にアップグレードしました。アップグレード後にupstartスクリプトを動作させるのに問題があり、systemdが新しいデフォルトであると読みました。私はLinuxの専門家とは程遠いので、簡単に言ってください:-)

以前の私のスタートアップスクリプトは次のとおりです。

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

systemd wikiページの開始 に基づいて、そこに提供されたテーブルを使用して、新しいsystemdサービスファイルでできる限り密接にマッピングしました。

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

このファイルは/home/robert/.config/systemd/user/nzbget.serviceにあります。サービスを手動で開始するために、私はやっています:

$ systemctl --user start nzbget

これはうまく機能します。ただし、SSHセッションからログアウトすると、サービスがシャットダウンします。また、起動時またはユーザーログイン時に起動しません。 upstartサービスと同じように動作するようにします。起動時に起動し、常に実行し、特定のユーザーとして実行するようにします。

この構成を取得するには何をする必要がありますか?

126
void.pointer

最初の問題

ユニットファイルのUser=セクションで、ディレクティブGroup=および[Service]を指定できます。

第二の問題

起動時にサービスを実行するには、ホームフォルダーに配置しないでください。代わりに、/etc/systemd/system/の下に配置します。これは、システム管理者(つまり、あなた)が新しいシステム全体のサービスを追加するために使用するためのフォルダーです。

その他のフォルダーは次のとおりです。

  • /usr/lib/systemd/system/は、ユニットファイルをインストールするパッケージを対象としていますが、DebianおよびUbuntuでは、さまざまなbinおよびlibフォルダーがマージされていないため、フォルダーは実際/lib/systemd/system/です。統一された/usr/プレフィックス。
  • /usr/local/systemd/system/は、ローカルにコンパイルされたパッケージによってユニットをインストールするためのものです。

ユニットのテスト

ユニットファイルが適切な場所に配置されたら、通常どおりsystemctl start <UNIT_FILENAME>と入力して、ユニットをすぐに起動してみてください。ユニットのフルパスを入力しなくても機能するはずです。また、.serviceの場合、拡張子を指定する必要はありません。

ユニットを有効にする

ユニットを有効にする前に、[Install]セクションを追加する必要があります。このセクションの下に、ディレクティブWantedBy=multi-user.targetを追加する必要があります。このディレクティブは、サービスを開始する起動プロセスの段階を指定します(有効になっている場合)。 multi-user.targetはほとんどのサービスに適しています。

その情報が追加されると、systemctl enable <UNIT_FILENAME>を使用できます。これにより、ユニットが有効になり、指定された段階での起動時にsystemdが自動的に起動します。

155
Yamaho

Systemdの「user lingering」機能の使用に興味があるかもしれません。 loginctl enable-linger USERNAMEで有効にします。

これにより、ブート時に開始される各ユーザーの個別のサービスマネージャーが発生するため、~/.config/systemd/user内のユーザー定義ユニットがピックアップされ、ブートおよびシャットダウン時にサービス構成に従って処理されます。

systemctl --userを使用して、システムの管理ではなく、ユーザーのサービスマネージャーで動作するサービスを管理および構成することもできます。

43
byteborg