systemdサービスをオーバーライドまたは構成するにはどうすればよいですか?


109

多くのsysv initスクリプトは、対応するファイル/etc/defaultを使用して管理者が構成できるようにしました。Upstartジョブは.overrideファイルを使用して変更できます。systemdがUbuntuのデフォルトになったので、systemdユニットをオーバーライドまたは構成するにはどうすればよいですか?


ExecStart=空白のエントリでをクリアするとき、次のようにコメントを追加できないことに注意してください。ExecStart= # Empty line to clear previous entries.これは別のExecStart=エントリとして取得され、リストに追加されます。PS。評判が悪いため、muruの回答にコメントを追加できませんでした。
tysik

回答:


185

systemdユニットはのファイルに従う必要はありません/etc/defaultsystemd設定は簡単ですが、systemdユニットファイルの構文を知っている必要があります。

パッケージには、通常、ユニットファイルが含まれてい/lib/systemd/system/ます。これらは編集されません。代わりに、でsystemd適切なファイルを作成して、これらのファイルをオーバーライドできます/etc/systemd/system/

特定のサービスfooについて、パッケージは提供します/lib/systemd/system/foo.service。を使用してステータスを確認するか、を使用systemctl status fooしてログを表示できますjournalctl -u foo。の定義で何かをオーバーライドするにはfoo、次のようにします。

sudo systemctl edit foo

これにより/etc/systemd/system、ユニットにちなんで命名されたディレクトリと、override.confそのディレクトリにファイルが作成されます(/etc/systemd/system/foo.service.d/override.conf)。このファイル(またはの他の.confファイル/etc/systemd/system/foo.service.d/)を使用して、設定を追加または上書きできます。

コマンド引数のオーバーライド

gettyたとえば、サービスを見てみましょう。自分のユーザーにTTY2の自動ログインをさせたいとします(これはお勧めできませんが、単なる例です)。TTY2はgetty@tty2サービス(tty2テンプレートのインスタンス/lib/systemd/system/getty@service)によって実行されます。これを行うには、getty@tty2サービスを変更する必要があります。

$ systemctl cat getty@tty2
# /lib/systemd/system/getty@.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by serial-getty@.service, not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty1

特に、ExecStart行を変更する必要があります。現在は次のとおりです。

$ systemctl cat getty@tty2 | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

これをオーバーライドするには、次のようにします。

sudo systemctl edit getty@tty2

そして追加:

[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

ご了承ください:

  1. ExecStart再度設定する前に明示的にクリアする必要がありました。これはAfterEnvironment(全体として、変数ごとではなく)およびEnvironmentFileに似た追加設定であり、RestartSecまたはなどの設定を上書きするのに反対Typeです。サービスExecStartに対してのみ複数のエントリを持つことができますType=oneshot
  2. 適切なセクションヘッダーを使用する必要がありました。元のファイルでExecStartは、[Service]セクションにあるため、オーバーライドもセクションに入れる必要ExecStartがあり[Service]ます。多くの場合、実際のサービスファイルを使用systemctl catすると、オーバーライドする必要があるものと、それが含まれているセクションがわかります。

通常、systemdユニットファイルを編集して有効にするには、次を実行する必要があります。

sudo systemctl daemon-reload

ただし、systemctl editこれは自動的に行われます。

今:

$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

$ systemctl show getty@tty2 | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }

そして、私がそうするなら:

sudo systemctl restart getty@tty2

そしてプレスCtrlAltF2、プレスト!そのTTYでアカウントにログインします。

前に言っgetty@tty2たように、テンプレートのインスタンスです。それで、そのテンプレートのすべてのインスタンスをオーバーライドしたい場合はどうなりますか?これは、テンプレート自体を編集することで実行できます(この場合、インスタンス識別子を削除しますtty2)。

systemctl edit getty@

環境をオーバーライドする

/etc/defaultファイルの一般的な使用例は、環境変数の設定です。通常、/etc/defaultシェルスクリプトであるため、シェル言語構造を使用できます。systemdしかし、このケースではありません。次の2つの方法で環境変数を指定できます。

ファイル経由

ファイルに環境変数を設定したとします:

$ cat /path/to/some/file
FOO=bar

次に、オーバーライドに追加できます。

[Service]
EnvironmentFile=/path/to/some/file

特に、に/etc/default/grub割り当てのみが含まれ、シェル構文が含まれていない場合は、として使用できますEnvironmentFile

Environmentエントリ経由

上記は、次のオーバーライドを使用して実現することもできます。

[Service]
Environment=FOO=bar

ただし、これは複数の変数、スペースなどでは扱いにくい場合があります。そのようなインスタンスの例については、他の回答のいずれかをご覧ください。

参考文献

このメカニズムを使用すると、systemdユニットをオーバーライドしたり、そのような変更を元に戻したりすることが簡単になります(オーバーライドファイルを削除するだけです)。変更できる設定はこれらだけではありません。

次のリンクが役立ちます。


1
タイプoneshotではないサービスに対して変数を設定する前に、変数をクリアする必要があります。これで私の問題が解決しました。
コリン

3
@MarkEdingtonのsystemd.service(5)マンページのセクションExecStart:「Type =がoneshotでない場合、コマンドを1つだけ指定する必要があります。Type= oneshotを使用すると、0個以上のコマンドを指定できます。このオプションに空の文字列が割り当てられている場合、開始するコマンドのリストはリセットされ、このオプションの以前の割り当ては無効になります。
ムル

1
@Orientでsudo rmオーバーライドファイルを作成してからsystemctl daemon-reload、または、またはsystemctl editオーバーライドですべてをコメントに置き換えることができます。サービスファイル内のコメントはで始まります#
ムル

3
@オリエントsystemctl revert foo
アイエル

1
3つのメソッド(オーバーライドファイル、環境ファイル、環境変数)の優先順位は何ですか?つまり、3つすべてで定義された変数の場合、どの値が有効な値になりますか?
ニコラオスカコロス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.