일련의 systemd 서비스를 실행한 다음 최종 서비스를 실행합니다.

일련의 systemd 서비스를 실행한 다음 최종 서비스를 실행합니다.

다음과 유사한 시나리오를 구현하고 싶습니다.

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.targetBefore=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결합되므로example1example2앞으로 daily-tasks.target"시작됨"으로 간주되어 example3 다른 모든 작업이 완료된 후에 실행됩니다.

관련 정보