다음과 유사한 시나리오를 구현하고 싶습니다.
daily_tasks와 같은 상위 서비스는 매일 XX:00에 시작됩니다.
서비스가 시작되면 백업, 정리, some_stuff 등 병렬로 실행될 수 있는 다른 서비스도 시작됩니다.
이 모든 작업이 완료되면 드라이브 마운트 해제, 종료와 같은 다른 서비스가 실행됩니다.
이제 partOf
저는 처음 두 부분인 엄브렐러 서비스와어린이제공하다. 그런데 어떻게 모든 서비스가 완료되었는지 확인하고 다른 서비스나 다른 우산 서비스를 시작할 수 있는지 모르겠습니다. 간단하게 만들때비어 있는모르는 우산 서비스어린이프로세스는 무기한으로 계속 실행됩니다.
systemd가 이 문제를 처리하도록 설계되지 않았다는 의견이 있더라도 어떤 아이디어라도 감사하겠습니다!
매우 감사합니다!
답변1
대상 유닛 생성
.target
먼저 동기화 지점 역할을 할 셀을 만듭니다 . 이 예에서는 다음을 생성해 보겠습니다 daily-task.target
.
[Unit]
Description=Run daily tasks
일일 업무 서비스 생성
병렬로 실행되는 서비스의 경우 Type=oneshot
(a)와 (b)를 실행하는 서비스 단위를 만듭니다. 예를 들어:RequiredBy=daily-task.target
Before=daily-task.target
예시 1. 서비스
[Unit]
Before=daily-task.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 10; date > /tmp/example1.txt'
[Install]
RequiredBy=daily-task.target
예시 2. 서비스
[Unit]
Before=daily-task.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 15; date > /tmp/example2.txt'
[Install]
RequiredBy=daily-task.target
사후 서비스 생성
실행해야 하는 서비스의 경우뒤쪽에모든 작업이 완료되고 RequiredBy=daily-task.target
서비스 단위가 (a) 생성되고 (b) 실행됩니다 After=daily-task.target
. 예를 들어:
예시 3. 서비스:
[Unit]
Description=Run after all daily tasks are complete
After=daily-task.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 10; date > /tmp/example3.txt'
ExecStopPost=/sbin/systemctl --no-block --user stop daily-tasks.target
[Install]
RequiredBy=daily-task.target
systemctl stop daily-task.target
대상을 "중지" 상태로 이동하기 위해 이 작업을 (후크를 통해 ) 실행합니다 ExecStopPost
. 이렇게 하지 않으면 systemctl start daily-task.target
대상이 이미 시작되었기 때문에 다음에 시도할 때 아무 일도 일어나지 않습니다.
서비스 활성화
systemctl --user enable example{1,2,3}.service
시작 대상
일상적인 작업을 실행하기 위해 대상을 시작합니다.
systemctl --user start daily-tasks.target
이런 일이 발생했을 때 로그를 보면 다음과 같은 내용이 표시됩니다.
Sep 06 17:44:19 hostname systemd[5435]: Starting example1.service...
Sep 06 17:44:19 hostname systemd[5435]: Starting example2.service...
Sep 06 17:44:29 hostname systemd[5435]: Finished example1.service.
Sep 06 17:44:34 hostname systemd[5435]: Finished example2.service.
Sep 06 17:44:34 hostname systemd[5435]: Reached target Start daily tasks.
Sep 06 17:44:34 hostname systemd[5435]: Starting example3.service...
Sep 06 17:44:44 hostname systemd[5435]: Stopped target Start daily tasks.
Sep 06 17:44:44 hostname systemd[5435]: Finished example3.service.
우리가 생성한 종속성은 우리가 사용 하고 실행하는 서비스와
Type=oneshot
결합되므로example1
example2
앞으로 daily-tasks.target
"시작됨"으로 간주되어 example3
다른 모든 작업이 완료된 후에 실행됩니다.