내가 읽고다중 사용자 대상이란 무엇입니까?그리고시스템 문서, 이는 multi-user.target이 특수 대상임을 나타냅니다. 또한, 많은시스템 예시이 줄을 포함합니다.
- 왜 그렇게 많은 샘플 서비스에 이 줄이 포함되어 있습니까?
- WantedBy=multi-user.target이 포함되어 있지 않으면 어떻게 되나요?
- 서비스 파일 정의에 해당 행을 포함하지 않는 것이 실제로 권장되는 경우에 대한 예를 들어주실 수 있습니까?
- 마찬가지로 언제 이 선을 유지하는 것이 좋은가?
답변1
1.) multi-user.target
기본적으로 클래식 SysVinit 런레벨 3과 가장 유사합니다 systemd
. systemd
시스템이 시작 되면 systemd
시스템 상태를 - 에 의해 지정된 상태와 일치시키려는 시도가 이루어집니다. 이는 일반적으로 또는 의 별칭입니다 default.target
.graphical.target
multi-user.target
multi-user.target
일반적으로 모든 네트워크 서비스가 시작되고 시스템이 로그인을 허용하지만 로컬 GUI가 시작되지 않는 시스템 상태가 정의됩니다. 이는 원격 서버실의 랙 장착형 헤드리스 시스템일 수 있는 서버 시스템의 일반적인 기본 시스템 상태입니다.
graphical.target
예, 또 다른 가능한 별칭입니다 default.target
. 일반적으로 이는 다음의 상위 집합으로 정의됩니다 multi-user.target
. 여기에는 multi-user.target
수행된 모든 작업과 로컬 GUI 로그인 활성화가 포함됩니다. 클래식 SysVinit의 런레벨 5와 약간 비슷합니다.
서비스의 이 줄은 SysVinit 시스템에서 "이 서비스는 실행 레벨 3, 4, 5에서 시작되어야 합니다" 를 지정하는 것과 WantedBy=multi-user.target
본질적으로 동일합니다. systemd
로컬 서비스 GUI가 활성 상태입니다.
그러나 WantedBy
활성화/비활성화 상태와는 별개입니다. 즉, 다른 의미에서 "사전 설정"입니다. 자동 시작이 발생할 수 있는 조건을 결정하지만 서비스가 처음 활성화된 경우에만 해당됩니다.
2.) 이 줄을 생략 WantedBy=multi-user.target
하고 활성화된 다른 서비스에 서비스 정의에 Requires=your.service
또는 이 포함되어 있지 않으면 Wants=your.service
서비스가 자동으로 시작되지 않습니다.
systemd
종속성에 대해 작동하며 시작 시 서비스에 아무것도 없으면 서비스가 활성화되어 있어도 시작되지 않습니다 Requires
.Wants
물론 부팅 시 시작하려는 서비스에 대해 default.target
추가, 제거 Requires
또는 줄을 편집할 수 있습니다 Wants
. 하지만 이렇게 하면 새 서비스 파일을 시스템에 넣고 기본적으로 작동하게 할 수 있습니다(이로 인해 소프트웨어가 매우 쉬워집니다) 패키지 관리자 ) 및 키워드를 systemd
사용하여 "다른 쪽"에서 종속성을 각각 삽입하고 유형을 지정할 수 있습니다.WantedBy
RequiredBy
Wants
Requires
3.) 만약 당신이아니요부팅 시 서비스가 자동으로 시작되도록 하려면또는서비스는 잘 정의된 종속성 체인의 일부입니다.
예를 들어, 서버 애플리케이션 A를 리팩터링하고 어떤 이유로 사용자가 필요하지 않은 경우 설치하지 않도록 선택할 수 있도록 일부 선택적 기능을 별도의 서비스 B로 분리하기로 결정할 수 있습니다. 그런 다음 서비스 B를 별도로 만들고 서비스 A가 시작될 때 서비스 B가 자동으로 시작되도록 service-B.rpm
정의 할 수 있습니다 B.service
. 하지만 실제로 설치된 경우에만 가능합니다 WantedBy=A.service
.systemd
service-B.rpm
또는 Wants
단순히 WantedBy
다른 서비스나 대상이 시작될 때 시스템이 하나의 서비스를 시작해야 함을 의미하지만 시작/종료 순서에 대해 전혀 지정하지 않습니다. 서비스 A가 시작될 때 서비스 B가 이미 실행되고 있어야 하는 경우 파일 Before=A.service
에 추가하여 B.service
시작 순서 종속성을 명시적으로 지정 해야 합니다 .
4.) 언제든지하다부팅 시 서비스가 자동으로 시작되고 다른 종속성이 정의되지 않기를 바랍니다.
답변2
삭제하면 WantedBy=multi-user.target
( systemctl enable your-example-here
시끄럽게) 아무것도 할 수 없게 됩니다.
그래픽 타겟
소스에서 순수 systemd를 설치하는 경우 부팅되는 "기본 대상"은 입니다 graphical.target
.
시작 graphical.target
시작 multi-user.target
및 그래픽 사용자 인터페이스를 제공하는 데 필요한 모든 단위입니다. 이러한 추가적인 복잡성은 레거시 "실행 수준"을 시뮬레이션하기 위해 마련되었습니다.
너진짜"런레벨" 가장은 무시되거나 마스크되어야 합니다. 어쨌든 제대로 작동하지 않습니다. 죄송합니다! 역사적으로 "그래픽"과 "다중 사용자"를 강조한 이유는 그래픽 소프트웨어가 1) 시스템의 다른 부분만큼 강력하고 성숙하지 않고, 2) 많은 리소스가 필요하기 때문인 것 같습니다.
일반적으로 특정 단위는 몇 개뿐입니다 graphical.target
. GUI 자체에는 서비스가 있습니다. 예를 들어 gdm.target
일부 지원 서비스가 있습니다.최대여기의 GUI도 이를 사용합니다.
편집: 인터넷 검색에서는 graphical.target
GUI가 설치되어 있지 않지만 "기본 대상"이 그대로 남아 있는 경우 systemd가 경고를 기록할 수 있다고 제안합니다. "display-manager.service 장치에 대한 종속성 작업을 추가할 수 없습니다. 무시: 장치 display-manager.service를 로드하지 못했습니다. 해당 파일이나 디렉터리가 없습니다." 로그에 불필요한 경고가 표시되지 않도록 하려고 합니다. 따라서 GUI가 설치되어 있지 않으면 을 사용하십시오 systemctl set-default multi-user
. 운영 체제의 설치 시스템이 이 문제를 해결했을 수도 있습니다. 그 외에 저는 이 문제에 대해 무관심을 유지하는 것을 강력히 지지합니다 :-).
시스템 초기화 대상
특정 서비스 및 기타 유형의 단위는 "초기 시작에 참여"합니다. 이는 Before=sysinit.target
직접적 또는 간접적 개시 로 정의됩니다 . 대부분의 서비스는 시작만 됩니다 After=sysinit.target
. 서비스가 설정되지 않으면 자동으로 시작됩니다 DefaultDependencies=no
.
다중 사용자 대상
대부분의 샘플 서비스는 위의 카테고리에 속하지 않으므로 해당 카테고리에 추가합니다 multi-user.target
. 여기에는 프로토타입 시스템 서비스인 대부분의 네트워크 서비스(예: 웹 서버)가 포함됩니다.
동적으로 활성화되는 서비스
살펴볼 수 있는 또 다른 가능성은 서비스 단위입니다.아니요시작 시 자동으로 시작됩니다. 따라서 필요하지 않습니다 WantedBy=multi-user.target
. 서비스는 다른 것에 의해 트리거되거나 "활성화"될 수 있습니다.
한 가지 예는 dbus 활성화 서비스입니다. Dbus 호출이 서비스에 이루어질 때 요청 시 서비스를 시작하도록 Dbus를 구성할 수 있습니다.
네트워크 서비스의 경우 소켓 활성화 서비스를 사용할 수 있습니다. 모든 구성이 시스템 장치에 있으므로 세부 정보를 찾는 것이 더 쉬울 수 있습니다. 예를 들어 sshd.socket
또는 를 활성화하는 데 종종 또는 을 ssh.socket
사용할 수 있습니다 . 그래도 부팅 시 sshd 서비스를 시작하는 것이 더 일반적이라고 생각합니다.[email protected]
[email protected]
언제나 그렇듯이 위의 내용은 단순화되었으며 불필요해 보이는 세부 사항은 생략되었습니다.
답변3
이것은 multi-user.target
의미론적 이름, 즉 의미와 연관되어 있습니다. 반례를 통해 이 개념을 설명하겠습니다. 어떤 주장을 사용할지에 대한 나의 결정은 multi-user.target
상황에 따라 달라집니다.
systemd를 만들고 싶다면사용자 단위대신 구성시스템 장치구성에서는 순진하게 systemd 시스템 장치 규칙을 따르고 multi-user.target
1 을 사용할 수 있습니다 .
반례 설명
문서를 고려하다/home/jonathan/.config/systemd/user/coolstuff.service
이 사용자는 user 만 사용할 수 있으므로 jonathan
내 대상을 "multi-user.target"이라고 부르는 것은 의미가 없습니다.
[Unit]
Description=Does some cool stuff.
[Service]
ExecStart=/bin/bash -c '/usr/bin/echo "Cool stuff" >> %h/coolstuff.txt'
[Install]
WantedBy=user.target
제가 어떻게 사용하는지 참고해주세요WantedBy=
사용자.대상. 이는 이 컨텍스트의 범위가 내 사용자 계정이기 때문에 내 자신의 의미 체계를 사용하기로 선택했습니다. 즉, 여러 사용자가 이 시스템의 영향을 받지 않습니다. 그러나 시스템 수준에서는 병렬 부팅 순서로 인해 표준화된 규칙을 따르는 것이 더 합리적입니다. 시작하는 동안 많은 프로세스가 여러 목표에 중점을 둡니다. 이는 multi-user.target
의미론적으로 "시스템과의 사용자 참여/상호작용 읽기"( 언급된 윈도우 시스템 telcoM 없이)라는 아이디어와 연결되어 있으므로 대부분의 시스템 장치 파일에 대해 안전한 선택입니다.
각주
- 이 경우에는 의미가 없더라도 여전히 작동합니다.