systemdはどのように「依存」ターゲットファイルとディレクトリをターゲット「単位」に含めますか?

systemdはどのように「依存」ターゲットファイルとディレクトリをターゲット「単位」に含めますか?

私のコンピュータ/lib/systemd/systemディレクトリにファイルがあります。multiuser.targetこのファイルには以下が含まれています。

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

この行は次のとおりです。Requires: basic.targetこれはファイルを「実行」することを意味すると思いますbasic.target
ただし、 /lib/systemd/system同じディレクトリにはサブディレクトリもありますmulti-user.target.wants/。これにはより多くの単位ファイルが含まれています。

/lib/systemd/system $tree multi-user.target.wants/
multi-user.target.wants/
├── dbus.service -> ../dbus.service
├── getty.target -> ../getty.target
├── systemd-ask-password-wall.path -> ../systemd-ask-password-wall.path
├── systemd-logind.service -> ../systemd-logind.service
├── systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
└── systemd-user-sessions.service -> ../systemd-user-sessions.service

ターゲットがデフォルトで実行されると、次のいずれのユニットが実行されますか?つまり、ファイル:basic.targetまたはサブディレクトリのすべてのユニットですか?上記の内容はすべてですか?それでは、どのような順序で?multi-user.wants.targetmulti-user.target

ベストアンサー1

Before/AfterWants/ /Requiresの間に違いがありますRequisite。最初のグループは次のことを意味します。タイミング単位から始まり、後者のグループは次を表します。依存関係。一般に、2つの間にほとんど差がありませんが、時には重要です。読む文書よく見ない内容を省略しているので詳細を確認するのに便利です。

たとえば、依存関係のある一部のサービスがあるとします。

サービス

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 5;/bin/false'
RemainAfterExit=yes

b.サービス

[Unit]
After=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo B
RemainAfterExit=yes

c.サービス

[Unit]
Requires=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo C
RemainAfterExit=yes

d.サービス

[Unit]
After=a.service
Requires=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo D
RemainAfterExit=yes

ロードされるアイテム(およびロードされる順序)は、実行するアイテムによって大きく異なります。

  • a:a
  • b:b
  • c(またはa+ c):a同時にc(失敗しcてもa実行され続けます)
  • d(またはa+ d):a- > ca起動が成功した場合)
  • a+ b: a-> b(a開始かどうか)

なぜそんなに複雑なのですか?これはユニットのロード速度を向上させるためのものです。サービスがお互いを持っていないか参照していない場合は、Before同時にAfter起動できます(他のデバイスでサービスが必要ないと仮定)。

ファイルはどこから来たのです.targetか?システムが起動(または停止など)されると、そのステップに必要なデバイスが一緒に起動できるようにデバイスを機能グループに配置し、デバイスは他のステップが開始されるのを待ちたいことを示します。たとえば、ユニットにAfter=network.targetmulti-user.target

単位が互いに依存する順序を表示するには、次のように実行します。 (ただし、ロードされる順番は/設定外でややランダムであるsystemctl list-dependenciesためお知らせしません。)BeforeAfter

おすすめ記事