하나의 타이머를 사용하도록 여러 시스템 서비스를 어떻게 구성합니까?

하나의 타이머를 사용하도록 여러 시스템 서비스를 어떻게 구성합니까?

동일한 타이머를 사용하도록 하나 이상의 서비스를 구성하는 방법에 관한 일부 시스템 문서 및 방법 문서에서 접근 방식에 몇 가지 중요한 변화가 있음을 발견했습니다.

내가 한데 모을 수 있었던 한(내가 틀렸을 수도 있지만) 이것은수배자그리고단위서비스 및 타이머 파일의 매개변수는 단일 서비스에 대해 (게시물 길이를 줄이기 위해 여기서 실제 코드 예제를 사용하지 않음)로 설정해야 하며 반대로 단일 타이머를 사용하는 다중 서비스 구성으로 설정해야 합니다.

단일 서비스의 타이머

My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3) 

(1)서비스 파일에는 WantedBy 매개변수가 있는 [Install] 섹션이 필요하지 않습니다.

(2)타이머의 [Timer] 섹션에서 Unit 매개변수는 My.Service1 서비스 파일을 가리켜야 합니다.

(삼)타이머 파일에는 이를 시작하는 데 사용될 일부 특수 시스템 대상을 가리키는 WantedBy 매개변수가 있습니다.

여러 서비스에 대한 타이머

My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???

(1)서비스는 모두 WantedBy 매개변수를 사용하여 동일한 정의된 대상에 연결되어야 합니다.

(2)[Timer] Unit 매개변수도 대상을 가리켜야 합니다.

후자 구성의 예는 다음을 참조하세요.이 방법. 이를 예제 1로 계산하겠습니다. 그러나 이 예제에서 벗어나는 다른 방법 예제를 찾았습니다(아래 참조).

실시예 2그리고실시예 3다음과 같이 구성해야 한다고 가정해 보겠습니다.

My.Service1 WantedBy: Timer.Target
My.Service2 WantedBy: Timer.Target
My.Service3 WantedBy: Timer.Target
Timer 'Unit' Param: My.Service1 (1)
Timer 'WantedBy' Param: MultiUser/Basic.Target

(1) 여러 서비스 중 하나만 가리키는 장치를 두면 다른 서비스가 타이머를 사용할 수 없기 때문에 문서에서 이를 간과해야 합니다. 아마도 이는 실제로 변경해야 할 내용을 (중요하게) 언급하지 않고 독자에게 단일 서비스 구성을 다시 참조하기 위해 사용된 "위 참조" 접근 방식 때문이었을 것입니다.

그런 다음실시예 4해당 구성은 실제로 작동할 것처럼 보이지만, 바로 아래에 서비스 파일을 생성하여 다른 방식으로 서비스를 대상과 연결합니다./etc/systemd/system/Timer.Target.wants/서비스 파일의 모든 WantedBy 매개변수를 제외합니다. 따라서:

My.Service1 'WantedBy' Param: N/A
My.Service2 'WantedBy' Param: N/A
My.Service3 'WantedBy' Param: N/A
Timer 'Unit' Param: Timer.Target
Timer 'WantedBy' Param: MultiUser/Basic.Target

내가 본 예제 1과 4 사이의 하이브리드 접근 방식은 다음 위치에 서비스 파일을 생성하는 것입니다./etc/systemd/system/디렉토리(기본 위치) 아래에 해당 서비스 파일에 대한 심볼릭 링크를 생성합니다./etc/systemd/system/Timer.Target.wants파일과들어오지 못하게 하다서비스 파일의 WantedBy 매개변수(기능적으로 예제 4와 동일), 또 다른 구성은 기호 링크 방법을 사용하지만 추가로 서비스 파일에 WantedBy 매개변수(중복되고 불필요한 것으로 보임)를 포함합니다.

내 질문은 예제 4 및 하이브리드 접근 방식에 대한 것입니다. 왜 아무것도 아래에 두어야 합니까?*.원함WantedBy 매개변수를 선언하면 systemd가 이를 수행하도록 지시해야 하는 경우 디렉토리가 전혀 필요하지 않습니다(해당 매개변수에 대한 설명에 명시된 대로).이 페이지)?

이를 수행하기 위한 접근 방식의 혼란스러운 다양성 속에서 동일한 타이머를 사용하여 여러 서비스를 구성하는 가장 좋은 방법을 밝힐 수 있는 사람이 있습니까?

답변1

단일 타이머로 여러 서비스를 활성화하려면 다음 사이에 대상을 삽입하세요.

타이머 유닛을 다음과 같이 부르겠습니다 foo.timer.

[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target
Wants=foo.target

[Timer]
OnCalendar=Sat 9:00
Unit=foo.target

[Install]
WantedBy=timers.target

대상 유닛을 다음과 같이 부르겠습니다 foo.target.

[Unit]
Description=My target unit, that groups my two services xxx.service and yyy.service
Wants=xxx.service yyy.service
After=xxx.service yyy.service

[Install]
Also=foo.timer

그런 다음 두 가지 서비스 xxx.serviceyyy.service:

[Unit]
Description=My service XXX

[Service]
ExecStart=/bin/echo I am XXX

[Install]
Also=foo.timer
[Unit]
Description=My service YYY

[Service]
ExecStart=/bin/echo I am YYYY

[Install]
Also=foo.timer

이 4개의 유닛 파일( foo.timer, foo.target, xxx.service, yyy.service)을 에 복사합니다 /etc/systemd/systemd/. 그런 다음 다음을 실행하여 타이머를 활성화하고 시작합니다.

systemctl enable --now foo.timer` 

이는 시스템에 정의된 다양한 타이머를 모두 끌어오는 일반 대상인 에 foo.timer연결 됩니다.timers.target

systemctl enable foo.targetbtw 및 또한 수행할 수도 있습니다 systemctl enable zzz.service. Also=해당 단위의 라인이 활성화 요청을 로 전파하기 때문입니다 foo.timer.

답변2

시스템 타이머는 항상 하나의 장치를 활성화합니다.

동일한 일정으로 두 개의 장치를 활성화하려면 명확성을 위해 동일한 일정이 포함된 두 개의 타이머 파일을 만드는 것이 좋습니다.

그렇지 않으면 원하는 두 서비스를 시작하는 "서비스 단위" 파일을 만들 수 있습니다.

나는 "WantedBy="가 타이머 단위에 특히 유용한 개념이라고 생각하지 않습니다.

관련 정보