다른 장치가 실행 중인 동안 장치를 중지하는 방법

다른 장치가 실행 중인 동안 장치를 중지하는 방법

현재 다음을 사용하여 자동 백업을 설정하려고 합니다.보그. 이를 위해 타이머를 통해 시작하려고 계획한 일회성 시스템 사용자 서비스(borgbackup.service라고 함)를 작성했습니다.

Borg는 백업 저장소를 가상 파일 시스템으로 마운트할 수도 있습니다. 백업이 항상 마운트되기를 원합니다. 저는 이를 위해 borgmount.service라는 또 다른 사용자 서비스를 작성했습니다. 단, 리포지토리 설치 중에는 백업을 생성할 수 없습니다.

이 문제에 대한 현재 해결책은 백업 전후에 설치 서비스를 중지하고 다시 시작하는 borgbackup.service의 다음 줄로 구성됩니다.

ExecStartPre=/usr/bin/systemctl --user stop borgmount.service
ExitStart=/bin/sh -c "borg create ::$(date) --exclude-caches --keep-tag-files"
ExecStopPost=/usr/bin/systemctl --user start borgmount.service

이는 매우 보기 흉하며 백업이 시작될 때 borgmount.service 장치의 상태(아마도 중지되고 비활성화됨)를 고려하지 않습니다.

더 좋은 방법이 있나요?

답변1

이는 완벽한 솔루션은 아니지만 ExecStartPre사용할 수 있습니다 Conflicts.

갈등 =

공백으로 구분된 단위 이름 목록입니다. 부정적인 요구 사항 종속성을 구성합니다. 한 유닛이 다른 유닛에 충돌=을 설정한 경우 전자를 시작하면 후자는 중지되고 그 반대의 경우도 마찬가지입니다. 이 설정은 After= 및 Before= 순서 종속성과 독립적이며 직교합니다.

ExecStopPost이를 충돌이 활성화되었는지 확인하는 명령과 결합 할 수 있습니다 .

ExecStopPost=/usr/bin/systemctl is-enabled borgmount.service && /usr/bin/systemctl --user start borgmount.service

연산자 에 익숙하지 않은 경우 &&첫 번째 명령이 성공하면 두 번째 명령이 실행됩니다. systemctl is-enabled장치가 활성화되면 0을 반환합니다.

서비스 시작 및 중지를 다루는 사용 사례는 아직 없지만 더 복잡 ExecStopPost하거나 결정적인 상태를 처리할 수는 있습니다 ExecStartPre. 불행하게도 다른 장치가 실행 중인 동안에만 장치를 중지하라는 지침이나 이와 유사한 것은 systemd없습니다 .Interupts


an 외에도 in을 ExecStartPost지정할 수도 있고 단지 실행하는 대신에 run을 실행할 수도 있지만 이를 위해서는 두 가지를 동시에 실행해야 한다는 점을 기억해야 합니다.Conflicts=borgmount.servicesystemctl start borgbackup.servicesystemctl start borgbackup.service borgmount.service


또 다른 옵션(아마도 가장 깨끗한)은 Conflicts두 서비스를 모두 사용하고 두 서비스를 모두 포함하는 새 백업 대상을 만드는 것입니다.

borgbackup.service필요:

Before=borgmount.service먼저 실행되는지 확인하세요.

WantedBy=${NEW_TARGET}새 대상을 실행하면 해당 대상이 실행되는지 확인합니다.

borgmount.service필요:

WantedBy=${NEW_TARGET}, WantedBy하나의 단위에 여러 지시어를 지정할 수 있습니다.

그런 다음 트리거 백업을 사용할 수 있습니다 systemctl start ${NEW_TARGET}.

이 방법의 장점은 borgmount.service활성화되지 않은 경우 실행되지 않는다는 것입니다 ${NEW_TARGET}. 실행하지 않고 백업을 트리거하려는 경우 별도로 호출할 수 있습니다 borgmount.service.borgbackup.service

관련 정보