시스템 원샷은 한 번만 실행해야 합니다.

시스템 원샷은 한 번만 실행해야 합니다.

환경 파일을 생성해야 하는 여러 시스템 서비스가 있습니다. 이 환경 파일을 생성하는 쉘 스크립트가 있지만 환경 파일이 필요하기 때문에앞으로Exec... 명령을 실행하려면 ExecStartPre=generate_env_file.sh를 사용할 수 없습니다. 그래서 스크립트를 한 번 실행하기 위해 다른 서비스(generate_env_file.service)를 설정했습니다.

[Service]
Type=oneshot
ExecStartPre=/usr/bin/touch /path/to/config.ini
ExecStart=/path/to/generate_env_file.sh

다음을 포함하는 다른 서비스 파일이 여러 개 있습니다.

[Unit]
Requires=generate_env_file.service
After=generate_env_file.service

두 개 이상의 종속 서비스(generate_env_file.service 필요)가 병렬로 실행되지 않도록 하고 병렬로 실행되는 두 개의 generate_env_file.services를 생성하는 방법은 무엇입니까?

RemainAfterExit=true 또는 StartLimitIntervalSec= 및 StartLimitBurst=를 사용하여 한 번에 하나의 복사본만 실행되도록 고려했지만 이를 수행하는 가장 좋은 방법은 확실하지 않습니다.

답변1

RemainAfterExit=true가는 길입니다. 이 경우 Systemd는 서비스를 시작하고 Systemd는 서비스가 시작되어 활성 상태라고 생각합니다. 그러나 여기에는 수행된 사용 사례가 포함되지 않습니다 systemctl restart generate_env_file.service. 이 경우 systemd는 서비스를 다시 실행합니다. 이 문제를 해결하려면 실행 중인 파일 시스템에 태그 파일을 생성 ExecStartPost=하고 추가 할 수 있습니다.ConditionPathExists=지시문은 파일이 존재하는지 확인합니다.

답변2

ConditionFirstBoot또한 흥미로울 수도 있습니다:

부울 매개변수를 사용합니다. 이 조건은 시스템이 처음으로 시작되는지 여부에 따라 장치의 상태를 결정하는 데 사용할 수 있습니다. 이는 대략적으로 /etc/부팅을 시작할 때 시스템이 채워지지 않음을 의미합니다(자세한 내용은 최초 부팅 의미론 참조). 기계 ID(5)). 관리자가 시작 단계를 완료한 후 첫 번째 시작은 완료된 것으로 간주됩니다(이 조건은 false로 평가됨).

/etc/이 조건 은 공장 재설정 후 첫 번째 부팅 시 또는 새 시스템 인스턴스의 첫 번째 부팅 시 채우는 데 사용될 수 있습니다 .

견고성을 위해 유닛은 ConditionFirstBoot=yes먼저 스스로 명령을 내리고 first-boot-complete.target이 수동 목표를 끌어당겨야 합니다 Wants=. 이렇게 하면 첫 번째 부팅이 중단된 경우 다음 시스템 부팅 중에 해당 장치가 다시 실행됩니다.

이 옵션이 커널 명령줄에 지정 되면 systemd.condition-first-boot=(부울 값 사용) 이 조건부 확인 결과를 무시하고 /etc/machine-id 존재 확인보다 우선합니다.

답변3

generate_env_file.sh시작 후 즉시 잠금 파일이 있는지 확인하도록 업데이트되었습니다 . 잠금 파일이 있으면 즉시 종료하십시오.

잠금 파일이 없으면 지금 잠금 파일을 터치하고 프로필을 생성하는 작업을 수행한 다음 잠금 파일을 삭제하세요.

즉, systemd구성을 통해 설명하는 상황을 처리하는 기본 방법이 없다고 생각하므로 잠금 파일을 사용하십시오.

@shellter가 지적했듯이 Unix 사이트는 systemd향후 질문에 대한 더 나은 사이트입니다.

관련 정보