나는 systemd
기반 배포( debian 10
)와 레거시 init.d
서비스( backuppc
)를 가지고 있습니다. 백업이 외부 드라이브에 저장되기 때문에 해당 백업 파티션이 마운트될 때까지 백업 서비스가 실행되지 않도록 하고, 설치가 불가능한 경우 일시 중지하고, 백업 후에 다시 시작하도록 하고 싶습니다.
backuppc
기존 패키지와 마찬가지로 init.d
-script를 -script로 마이그레이션하는 것은 systemd
선택 사항이 아니며 백업 시스템에 매우 중요한 안정성 문제가 걱정됩니다.
질문
init.d
레거시 서비스를 로직의 마운트에 의존하게 만드는 (우아한) 방법이 있습니까systemd
?하나의 다른 서비스/대상을 통해 전제 조건(설치 종료)에 따라 다른 서비스를 조건부로 시작/중지할 수 있습니까?
다음 방법은 신뢰할 수 있습니까?
현재 나의 생각은 다음과 같습니다.
check-mount.target
그들 중 하나- 마운트가 존재하는 경우 성공 또는 실패
- (다시)필요한 경우 설치
- 백업 서비스 이전에 나타납니다.
- 백업 서비스 시작
stop-backup.service
그들 중 하나- 활동 상태 확인
check-mount.target
- 마운트가 활성화되지 않은 경우 백업 서비스를 중지합니다.
- 활동 상태 확인
타이머 다시 시작
check-mount.target
다음과 같습니다.
#check-mount.target
[Unit]
Description="starts backuppc if mount is present, fails otherwise"
BindsTo=backup_data.mount
After=backup_data.mount
Before=backuppc.service
Wants=backuppc.service
[Install]
WantedBy=default.target
#stop-backup.service
[Unit]
Description="stops backup if mount is NOT present"
[Service]
#stop backup service if check-mount.target failed/is not active
ExecCondition=/usr/bin/bash -c '! /usr/bin/systemctl is-active --quiet backup_data.mount'
ExecStart=/usr/bin/systemctl stop backuppc
#restart will fail as long as mount is present:
Restart=on-failure
RestartSec=2
[Install]
WantedBy=default.target
#timer for check-mount.target
OnUnitInactiveSec=10
Unit=check-mount.target
[Install]
WantedBy=default.target
이 결과/기타 결과에서 마음에 들지 않는 점:
- 두 개의 서비스와 하나의 타이머가 필요하며 그 중 하나는 지속적으로 다시 시작됩니다. => 서로를 트리거하는 간단한 종속성을 선호합니다.
Conflicts=backuppc
-test가 실행되기 전에 충돌이 발생하므로 in을 사용할stop-backup.service
수 없습니다ExecCondition
. 즉, 백업 서비스가 항상 중지됩니다.- AFAIK에는 논리가 제공되지
systemd
않습니다 . 즉 , 다른 서비스가 실패하면 하나의 서비스를 시작하고 그 반대의 경우도 불가능합니다(그러나 백업 중지를 단순화함).NOT
BindsTo=*NOT*backup_data.mount
답변1
나는 init.d 시작 스크립트 함수를 호출하는 시스템 서비스 파일을 작성하는 것이 매우 간단해야 한다고 생각합니다.
* ExecStart= -> start function
* ExecStop= -> stop function
* ...
이로 인해 After=, Wants= 또는 Require=와 같은 시스템별 지시어에 의존하는 것이 쉬워집니다.
이 질문은 init.d 블록을 빈 systemd 서비스 파일에 포함하여 systemd가 마법처럼 올바른 작업을 수행하도록 만드는 방법도 보여줍니다.https://serverfault.com/questions/690155/whats-the-easiest-way-to-make-my-old-init-script-work-in-systemd