내 컴퓨터 /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
. 첫 번째 그룹은 다음을 의미합니다.타이밍단위부터 시작하여 후자 그룹은 다음을 나타냅니다.종속성. 일반적으로 둘 사이에는 차이가 거의 없지만 때로는 중요합니다. 읽다문서자주 보지 않는 내용을 생략했기 때문에 자세한 내용을 확인하는 데 유용합니다.
예를 들어, 종속성이 있는 일부 서비스가 있다고 가정해 보겠습니다.
서비스
[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