私のコンピュータ/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.target
multi-user.target
答え1
Before
/After
とWants
/ /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
- >c
(a
起動が成功した場合)a
+b
:a
->b
(a
開始かどうか)
なぜそんなに複雑なのですか?これはユニットのロード速度を向上させるためのものです。サービスがお互いを持っていないか参照していない場合は、Before
同時にAfter
起動できます(他のデバイスでサービスが必要ないと仮定)。
ファイルはどこから来たのです.target
か?システムが起動(または停止など)されると、そのステップに必要なデバイスが一緒に起動できるようにデバイスを機能グループに配置し、デバイスは他のステップが開始されるのを待ちたいことを示します。たとえば、ユニットにAfter=network.target
。multi-user.target
単位が互いに依存する順序を表示するには、次のように実行します。 (ただし、ロードされる順番は/設定外でややランダムであるsystemctl list-dependencies
ためお知らせしません。)Before
After