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サービスと同じように動作するようにします。起動時に起動し、常に実行し、特定のユーザーとして実行するようにします。
この構成を取得するには何をする必要がありますか?
ユニットファイルの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が自動的に起動します。
Systemdの「user lingering」機能の使用に興味があるかもしれません。 loginctl enable-linger USERNAME
で有効にします。
これにより、ブート時に開始される各ユーザーの個別のサービスマネージャーが発生するため、~/.config/systemd/user
内のユーザー定義ユニットがピックアップされ、ブートおよびシャットダウン時にサービス構成に従って処理されます。
systemctl --user
を使用して、システムの管理ではなく、ユーザーのサービスマネージャーで動作するサービスを管理および構成することもできます。