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


133

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サービスと同じように動作するようにします。起動時に起動し、常に実行し、特定のユーザーとして実行するようにします。

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

回答:


164

最初の問題

あなたはディレクティブを指定することができますUser=し、Group=中に[Service]ユニットファイルのセクション。

第二の問題

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

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

  • /usr/lib/systemd/system/DebianとUbuntuの下にフォルダが実際にあるものの、ユニットファイルをインストールするパッケージのためのものです/lib/systemd/system/様々なのでbinlibフォルダが統一にマージされていない/usr/、まだ接頭辞。
  • /usr/local/systemd/system/ ローカルにコンパイルされたパッケージによるユニットのインストール用です。

ユニットのテスト

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

ユニットを有効にする

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

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


これはうまくいきました。systemctl enableコマンドでサービスファイル名への絶対パスを指定する必要がありましたが、これは最初は明らかではありませんでした。また、有効にすると、[Install]セクションの欠落に関する警告が表示されます。私はそれを無視しましたが、ブート時に起動する機能に影響するかどうかはわかりません。
void.pointer

2
Install警告は、実際に本当に重要でした。セクションのWantedBy=multi-user.target下で起動しないと起動しません[Install]。これを.serviceファイルに追加したら、それを実行できenableます。
-void.pointer

4
このような長い間、答えを残さないことをおaびします。ユニットファイルを配置する場所を修正し、[Install]セクションに関する欠落情報を追加しました。これをお探しの方にとってより便利なものになりますように。
山穂

5
あなたのサービスが形式のファイル名で定義されている。すなわち、ユーザー名は、テンプレート化されたときにこれがずっと容易になりsomething@.service、その後enable好きなdのsomething@username.service設定になりUser=%i、ユーザを意味するハードコーディングされておらず、複数のユーザーが同じ定義を使用することができます。例。
ウォルフ

1
下に置くと起動し/etc/systemd/user/ますか?
ルシッドアラム

46

systemdの「ユーザー残留」機能の使用に興味があるかもしれません。経由で有効になりloginctl enable-linger USERNAMEます。

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

またsystemctl --user、システムの管理者ではなく、ユーザーのサービスマネージャで動作するサービスの管理と設定にも使用できます。


6
systemctl --user素晴らしい発見です。ありがとう!
アンワル

@byteborgたぶん、unix.stackexchange.com / questions / 409900 /…に貢献できますか?ユーザーの残留サービスではPostgreSQLに依存する必要がありますが、データベースはユーザーのサービスではなくシステムサービスのままです。
ミチャウF

1
サービスが実行されたら、ユーザーがサービスのログを表示できるようにする方法はありますか?特権のないユーザーは/ var / log / syslogにアクセスできません。
mpr

2
ただし、systemctl --userSSHセッションでは機能しないようです。
マークKコーワン

2
受け入れ解決する必要があります
ドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.